我可以在Matlab中快速执行以下操作吗?
我在Matlab中有三个矩阵,A是nxm,B是pxm,C是rxn 假设我们使用以下方法初始化一些矩阵:我可以在Matlab中快速执行以下操作吗?,matlab,Matlab,我在Matlab中有三个矩阵,A是nxm,B是pxm,C是rxn 假设我们使用以下方法初始化一些矩阵: A = rand(3,4); B = rand(2,3); C = rand(5,4); 以下两项是等效的: >> s=0; >> for i=1:3 for j=1:4 s = s + A(i,j)*B(:,i)*C(:,j)'; end; end >>
A = rand(3,4);
B = rand(2,3);
C = rand(5,4);
以下两项是等效的:
>> s=0;
>> for i=1:3
for j=1:4
s = s + A(i,j)*B(:,i)*C(:,j)';
end;
end
>> s
s =
2.6823 2.2440 3.5056 2.0856 2.1551
2.0656 1.7310 2.6550 1.5767 1.6457
>> B*A*C'
ans =
2.6823 2.2440 3.5056 2.0856 2.1551
2.0656 1.7310 2.6550 1.5767 1.6457
后者的效率要高得多
对于以下循环变量,我找不到任何有效的版本:
s=0;
for i=1:3
for j=1:4
x = A(i,j)*B(:,i)*C(:,j)';
s = s + x/sum(sum(x));
end;
end
在这里,被添加的矩阵通过每一步后它们的值之和进行归一化
有没有办法让这像上面的矩阵乘法一样有效?我想accumarray可能会有所帮助,但不确定如何帮助。您可以使用
bsxfun
高效地完成这项工作:
aux1 = bsxfun(@times, permute(B,[1 3 2]), permute(C,[3 1 4 2]));
aux2 = sum(sum(aux1,1),2);
s = sum(sum(bsxfun(@rdivide, aux1, aux2),3),4);
注意,由于标准化,结果独立于A
,假设它不包含任何零项(如果包含零项,则结果未定义)