r使用upper.tri函数从向量创建对角矩阵

时间:2019-04-03 17:30:38

标签: r matrix vector

我有矢量

vector= c(4,6,2,9)

我需要使对角矩阵看起来像这样(第二列应包含将向量向下滚动到一个元素上,第三列-向下滚动到两个元素等):

4 0 0 0
6 4 0 0
2 6 4 0
9 2 6 4

我可能会不明白,所以我应该使用upper.tri。

我尝试过这个:

vector = c(4,6,2,9)
vector_length=length(a)
MATRIX= matrix(0, vector_length, vector_length)
MATRIX[!upper.tri(MATRIX)]=vector 
MATRIX

失败,因为结果是

       [,1] [,2] [,3] [,4]
[1,]    4    0    0    0
[2,]    6    4    0    0
[3,]    2    6    9    0
[4,]    9    2    4    6

如何正确使用此功能?而我该如何解决我的问题呢?

2 个答案:

答案 0 :(得分:2)

这是一种方法:

MATRIX = matrix(c(vector, 0), vector_length, vector_length)
# ignore warning about uneven recycling
MATRIX[upper.tri(MATRIX)] = 0
#      [,1] [,2] [,3] [,4]
# [1,]    4    0    0    0
# [2,]    6    4    0    0
# [3,]    2    6    4    0
# [4,]    9    2    6    4

答案 1 :(得分:1)

一种选择是利用data.table::shift参数中的n是矢量化的事实

do.call(cbind, data.table::shift(vector, seq(vector_length) - 1, fill = 0))
#      [,1] [,2] [,3] [,4]
# [1,]    4    0    0    0
# [2,]    6    4    0    0
# [3,]    2    6    4    0
# [4,]    9    2    6    4

或在基数R中使用row()col()

m <- matrix(0, vector_length, vector_length)
diagn <- row(m) - col(m) + 1
m[diagn > 0] <- vector[diagn[diagn > 0]]

m
#      [,1] [,2] [,3] [,4]
# [1,]    4    0    0    0
# [2,]    6    4    0    0
# [3,]    2    6    4    0
# [4,]    9    2    6    4