繁体   English   中英

在matlab中矢量化成对kronecker产品

[英]Vectorize the pairwise kronecker product in matlab

假设有两个相同大小的矩阵,我想计算其列式kronecker积的总和。 由于有时柱尺寸非常大,因此速度可能非常慢。 因此,无论如何有向量化这个函数或任何函数可能有助于降低matlab的复杂性? 提前致谢。

下面提供了带有for循环的相应matlab代码, d的答案是感兴趣的输出:

A = rand(3,7);
B = rand(3,7);
d = zeros(size(A,1)*size(B,1),1);
for i=1:size(A,2)
    d = d + kron(A(:,i),B(:,i));
end

使用Daniels给出的Kronecker产品的重写答案

e=zeros(size(B,1),size(A,1));
for i=1:size(A,2)
    e = e + B(:,i)*A(:,i).';
end
e=reshape(e,[],1);

我们这么说

C = A'

因此

for i=1:m
    e = e + B(:,i)*C(i,:);
end

这是矩阵产品的定义

B*C.

总之,该问题因此可以通过简单的矩阵产品来解决

d = reshape(B*A',[],1);

两个向量的kronecker乘积只是两个向量的矩阵乘法的重新形成结果:

e=zeros(size(B,1),size(A,1));
for i=1:size(A,2)
    e = e + B(:,i)*A(:,i).';
end
e=reshape(e,[],1);

现在知道它只是一个产品的总和,它可以使用bsxfun

f=reshape(sum(bsxfun(@times,permute(B,[1,3,2]),permute(A,[3,1,2])),3),[],1);

根据输入的不同,bsxfun-sulution比矩阵乘法稍快,但是内存消耗很高。 bsxfun-solution使用O(size(A,1)*size(B,1)*size(B,2))而for循环仅使用O(size(A,1)*size(B,1))除了输入参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM