我有矢量
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
如何正确使用此功能?而我该如何解决我的问题呢?
答案 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