按特定顺序将 R 中的向量转换为 lower/upper 三角矩阵
Converting a vector in R into a lower/upper triangular matrix in specific order
我有一个向量,其中元素的顺序很重要,例如:
v<-c(1,2,3,4,5,6,7,8,9,10)
我想将我的向量排列成具有特定顺序的 lower/upper 三角矩阵:
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
我想我可以用 for 写出来,但我不知道怎么做,空格可以用 NA 或 0 填充
谢谢
你可以通过
来填充上三角矩阵
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
我有一个向量,其中元素的顺序很重要,例如:
v<-c(1,2,3,4,5,6,7,8,9,10)
我想将我的向量排列成具有特定顺序的 lower/upper 三角矩阵:
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
我想我可以用 for 写出来,但我不知道怎么做,空格可以用 NA 或 0 填充
谢谢
你可以通过
来填充上三角矩阵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