我正在寻找一种计算两个大型矩阵的克罗内克积的有效方法。我尝试使用kronecker()
如下方法:
I = diag(700)
data = replicate(15, rnorm(120))
test = kronecker(I,data)
但是,执行需要很长时间,然后给出以下错误:
Error: cannot allocate vector of size 6.8 Gb
只要您使用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"
如果你正在计算kron(I,A)*v
wherev
是一个向量,你可以使用vec(A*V)
where V
reshapes v
into a matrix 来做到这一点。这使用了更一般的规则vec(ABC)=kron(C',A)*vec(B)
。这避免了形成克罗内克积并使用更少的操作来执行计算。
请注意,V
可能需要根据矩阵存储的处理方式(列与行)进行转置。