我可以在Matlab中快速执行以下操作吗?

时间:2013-11-01 16:13:34

标签: matlab

我在Matlab中有三个矩阵,A是n x m,B是p x m,C是r x n。

假设我们使用以下内容初始化一些矩阵:

    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可以提供帮助,但不确定如何。

1 个答案:

答案 0 :(得分:3)

您可以使用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,假设它不包含任何零条目(如果结果未定义)。