在R矩阵中的对角线上方插入数字

时间:2015-04-23 16:44:09

标签: r diagonal

我在R中有这样的矢量:

vec1 <- c(14000,12000,8000)

我试图创建一个矩阵,其中14000是我的主对角线,1200是一个在对角线上方,8000个在对角线上方。

我熟悉在Python / numpy中这样做但不能在R中弄明白(或者至少是一种有效的方法)。理想情况下,输出看起来像这样:

14000 12000  8000
    0 14000 12000
    0     0 14000

2 个答案:

答案 0 :(得分:6)

尝试

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

答案 1 :(得分:1)

在这种简单的情况下,您可以分别指定对角线和上三角形部分:

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是更好的通用解决方案。