10

我正在寻找一种计算两个大型矩阵的克罗内克积的有效方法。我尝试使用kronecker()如下方法:

 I = diag(700)
 data = replicate(15, rnorm(120))
 test = kronecker(I,data)

但是,执行需要很长时间,然后给出以下错误:

 Error: cannot allocate vector of size 6.8 Gb
4

2 回答 2

13

只要您使用Matrix::Diagonal构造对角矩阵,您就会自动将test对象构造为稀疏矩阵:

library(Matrix)
I=Diagonal(700)
data = replicate(15,rnorm(120))
system.time(test <- kronecker(I,data))
##   user  system elapsed
##  0.600   0.044   0.671 
dim(test)
## [1] 84000 10500
format(object.size(test),"Mb")
## [1] "19.2 Mb"
于 2013-09-17T14:00:29.083 回答
5

如果你正在计算kron(I,A)*vwherev是一个向量,你可以使用vec(A*V)where Vreshapes vinto a matrix 来做到这一点。这使用了更一般的规则vec(ABC)=kron(C',A)*vec(B)。这避免了形成克罗内克积并使用更少的操作来执行计算。

请注意,V可能需要根据矩阵存储的处理方式(列与行)进行转置。

于 2014-04-28T15:30:24.657 回答