假设有两个相同大小的矩阵,我想计算其列式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
答案 0 :(得分:4)
使用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);
答案 1 :(得分:3)
两个向量的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))
。