我想在矢量列表上使用diag()函数,以便得到一个矩阵列表,其中对角线是我列表的向量。
更具体地说,假设我有一个名为list
的列表,其中包含100个向量,每个向量有14个值。
>dim(list)
100 14
我想创建一个大小为14x14的100个矩阵的数组array
,其中矩阵diag2vec(array[i,,])
的对角线是我的向量list[i,]
(矩阵中的所有其他值都是0
)。
所以我最终会:
>dim(array)
100 14 14
我尝试使用diag()函数,但我不能让它按行工作。
答案 0 :(得分:0)
(M <- matrix(1:6, nrow = 2))
# [,1] [,2] [,3]
# [1,] 1 3 5
# [2,] 2 4 6
sapply(1:nrow(M), function(i) diag(M[i, ]), simplify = "array")
# , , 1
#
# [,1] [,2] [,3]
# [1,] 1 0 0
# [2,] 0 3 0
# [3,] 0 0 5
#
# , , 2
#
# [,1] [,2] [,3]
# [1,] 2 0 0
# [2,] 0 4 0
# [3,] 0 0 6
另请注意,M
是一个矩阵,而不是列表,应用于最后一个对象的dim
会返回3 3 2
,这是您真正想要的,而不是2 3 3
就像你的例子一样。
答案 1 :(得分:0)
第一次尝试太快。
使用library(abind)
library(abind)
abind(lapply(x, diag), along = 0)
其中x
被假定为您的向量列表
答案 2 :(得分:0)
确认您的数据如下:
z <- replicate(100, runif(14), simplify=FALSE)
尝试:
z2 <- aperm(vapply(z, diag, diag(14)), 3:1)
有:
> dim(z2)
[1] 100 14 14