在 R 矩阵的对角线上方插入数字
Insert number above the diagonal in R matrix
我在 R 中有这样一个向量:
vec1 <- c(14000,12000,8000)
我正在尝试创建一个矩阵,其中 14000 是我的主对角线,1200 是对角线上方的一个,8000 是对角线上方的两个。
我很熟悉在 Python/numpy 中执行此操作,但无法在 R 中解决(或至少是一种有效的方法)。理想的输出应该是这样的:
14000 12000 8000
0 14000 12000
0 0 14000
在这种简单的情况下,您可以像这样分别分配对角线和上三角部分:
m <- matrix(0, nrow=3, ncol=3)
diag(m) <- 14000
m[upper.tri(m)] <- c(12000, 8000, 12000)
但是,正如 David Arenburg 指出的那样,这是一种更加手动的方法,因此无法很好地扩展。对于更加自动化、可扩展的方法,我推荐使用 toeplitz()
和 lower.tri()
.
的 akrun 解决方案
为了您的具体情况的完整性,我会在这里保留这个答案,但我认为 akrun 的是更好的通用解决方案。
尝试
m1 <- t(matrix(vec1, nrow=5, ncol=3))[,1:3]
m1[lower.tri(m1)] <- 0
m1
# [,1] [,2] [,3]
#[1,] 14000 12000 8000
#[2,] 0 14000 12000
#[3,] 0 0 14000
或使用toeplitz
toeplitz(vec1)*upper.tri(diag(seq_along(vec1)), diag=TRUE)
# [,1] [,2] [,3]
#[1,] 14000 12000 8000
#[2,] 0 14000 12000
#[3,] 0 0 14000
或@David Arenburg 建议的修改
m <- toeplitz(vec1)
m[lower.tri(m)] <- 0
我在 R 中有这样一个向量:
vec1 <- c(14000,12000,8000)
我正在尝试创建一个矩阵,其中 14000 是我的主对角线,1200 是对角线上方的一个,8000 是对角线上方的两个。
我很熟悉在 Python/numpy 中执行此操作,但无法在 R 中解决(或至少是一种有效的方法)。理想的输出应该是这样的:
14000 12000 8000
0 14000 12000
0 0 14000
在这种简单的情况下,您可以像这样分别分配对角线和上三角部分:
m <- matrix(0, nrow=3, ncol=3)
diag(m) <- 14000
m[upper.tri(m)] <- c(12000, 8000, 12000)
但是,正如 David Arenburg 指出的那样,这是一种更加手动的方法,因此无法很好地扩展。对于更加自动化、可扩展的方法,我推荐使用 toeplitz()
和 lower.tri()
.
为了您的具体情况的完整性,我会在这里保留这个答案,但我认为 akrun 的是更好的通用解决方案。
尝试
m1 <- t(matrix(vec1, nrow=5, ncol=3))[,1:3]
m1[lower.tri(m1)] <- 0
m1
# [,1] [,2] [,3]
#[1,] 14000 12000 8000
#[2,] 0 14000 12000
#[3,] 0 0 14000
或使用toeplitz
toeplitz(vec1)*upper.tri(diag(seq_along(vec1)), diag=TRUE)
# [,1] [,2] [,3]
#[1,] 14000 12000 8000
#[2,] 0 14000 12000
#[3,] 0 0 14000
或@David Arenburg 建议的修改
m <- toeplitz(vec1)
m[lower.tri(m)] <- 0