2016-07-28 97 views
1

我有一个n x p矩阵,看起来像这样:“角化”矩阵中的每一行

n = 100 
p = 10  
x <- matrix(sample(c(0,1), size = p*n, replace = TRUE), n, p) 

我想沿着第一维A,其k个项创建n x p x p阵列是包含p x p对角矩阵x[k,]的元素。 R中最有效的方法是什么?我正在寻找一种使用outer(或其他矢量化方法)的方法,而不是apply函数之一。

解决方案使用lapply

A <- aperm(simplify2array(lapply(1:nrow(x), function(i) diag(x[i,]))), c(3,2,1)) 

我正在寻找的东西比这更有效。

感谢。

回答

2

作为一个起点,这里有一个简单的for循环方法,预分配矩阵。

# pre-allocate matrix of desired size 
myArray <- array(0, dim=c(ncol(x), ncol(x), nrow(x))) 
# fill in array 
for(i in seq_len(nrow(x))) myArray[,,i] <- diag(x[i,]) 

它应该运行得相对较快。在我的机器上,对于1000 X 100矩阵,lapply方法耗时0.87秒,而for循环(包括阵列预分配)耗时0.25秒将矩阵转换为所需阵列。所以for环路的速度快了3.5倍。


转你原来的矩阵

还要注意R上的矩阵该行的操作往往比列操作慢。这是因为矩阵按列存储在内存中。如果转置矩阵并以此方式执行操作,则在100X1000矩阵上完成操作的时间将减少为0.14,为第一个循环的一半,比lapply方法快7倍。

相关问题