将R中的向量按特定顺序转换为下/上三角矩阵

时间:2019-05-31 01:26:36

标签: r matrix vector triangular

我有一个向量,其中元素的顺序很重要,例如:

v<-c(1,2,3,4,5,6,7,8,9,10)

我想将向量按特定顺序排列到下/上三角矩阵中:

1 2 4 7
0 3 5 8
0 0 6 9
0 0 0 10

1 0 0 0
2 3 0 0
4 5 6 0
7 8 9 10

我认为我可以做到这一点,但我不知道如何,空白处可能会填充NA或0's

谢谢

1 个答案:

答案 0 :(得分:1)

您可以这样做来填充上三角矩阵

mat <- matrix(0, nrow = 4, ncol = 4)
mat[upper.tri(mat, diag = TRUE)] <- v

mat
#     [,1] [,2] [,3] [,4]
#[1,]    1    2    4    7
#[2,]    0    3    5    8
#[3,]    0    0    6    9
#[4,]    0    0    0   10

下三角形与上三角形的顺序不同

mat[lower.tri(mat, diag = TRUE)] <- v

没有给出预期的结果。

我们可以获得下三角的索引,根据行order对其进行索引,然后更新矩阵

order_mat <- which(lower.tri(mat, diag = TRUE), arr.ind = TRUE)
mat[order_mat[order(order_mat[, 1]), ]]  <- v

mat
#     [,1] [,2] [,3] [,4]
#[1,]    1    0    0    0
#[2,]    2    3    0    0
#[3,]    4    5    6    0
#[4,]    7    8    9   10

或者像@Gregor所说的那样,一种更简单的方法是转置上三角结果

mat <- matrix(0, nrow = 4, ncol = 4)
mat[upper.tri(mat, diag = TRUE)] <- v #Upper triangle
t(mat)   #Lower triangle