R中的多维度的Diag函数

时间:2016-01-24 22:42:51

标签: r list matrix diagonal

我想在矢量列表上使用diag()函数,以便得到一个矩阵列表,其中对角线是我列表的向量。

更具体地说,假设我有一个名为list的列表,其中包含100个向量,每个向量有14个值。

>dim(list)
100 14

我想创建一个大小为14x14的100个矩阵的数组array,其中矩阵diag2vec(array[i,,])的对角线是我的向量list[i,](矩阵中的所有其他值都是0)。

所以我最终会:

>dim(array)
100 14 14

我尝试使用diag()函数,但我不能让它按行工作。

3 个答案:

答案 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