我正在寻找一种计算两个大型矩阵的Kronecker积的有效方法。我尝试使用方法kronecker()
,如下所示:
I = diag(700)
data = replicate(15, rnorm(120))
test = kronecker(I,data)
但是,执行需要很长时间,然后会出现以下错误:
Error: cannot allocate vector of size 6.8 Gb
答案 0 :(得分:11)
只要您使用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"
答案 1 :(得分:4)
如果您正在计算kron(I,A)*v
其中v
是向量,您可以使用vec(A*V)
V
将v
重新整形为vec(ABC)=kron(C',A)*vec(B)
到矩阵中。这使用了更为一般的V
规则。这避免了形成Kronecker产品并使用少得多的操作来执行计算。
请注意,{{1}}可能需要转置,具体取决于矩阵存储的处理方式(列与行)。