如何对for循环进行向量化,但是在其中有条件?

时间:2013-09-20 13:16:40

标签: matlab for-loop vectorization

如何对for循环进行矢量化但是有条件? (主要在Matlab中)

一个for循环,其中基于二进制值(0或1)选择要乘以**的矩阵** 然后将其与另一个矩阵相乘以计算每次迭代时更新的累积产品。由于我有1亿分,所以很快就能做到这一点。如果可能的话,矢量化会有很大帮助。

[sizMat1 sizMat2] = size(matrixToMultiply); 

cumulMatProduct = ones(sizMat1,1); %stores the cumulative Products of chosen Matrices. 
%gets updated at every iteration

for ix = 2:length(col1)

    % Depending on if the value is either 0 or 1, pick a matrix;
     if (col1(ix) == 0 )
         cumulProduct = simpleMatrix0 * cumulMatrixProduct;
         matrixToMultiply = matrix1;

     elseif (col1(ix) == 1 )
         matrixToMultiply = matrix2;
     end

     anotherMatrixtoMultiply = diag( exp(constantMatrix) * col2(ix) ); 
     % Another Matrix is created by multiplying a scalar 
     %(picked from the same index ix of a different column col2 having same dimensions as col1)  

     cumulMatrixProduct = matrixToMultiply*anotherMatrixtoMultiply*cumulMatrixProduct; 

end

  % matrixToMultiply  is 101 x 101
  % constantMatrix is 101 by 1 
  % anotherMatrixtoMultiply is 101 by 101 
  % cumulMatrixProduct = 101 x 1 (Result ) 

提前致谢。

1 个答案:

答案 0 :(得分:1)

这里的问题不是条件,而是循环迭代之间存在数据依赖关系的事实。这可以防止并行处理,包括天真的矢量化。例如,prod函数对您没有帮助,因为它每行执行元素产品(可并行化!),而不是矩阵乘法。

我注意到的一件事是col2(ix)都是标量,可以从循环中删除。然后你最后乘以prod(col2(2:length(col1)))anotherMatrixToMultiply不会改变每次迭代。但是,你不能将它移到循环之外,因为矩阵乘法不是可交换的(即使它是根据线性代数的规则,改变浮点运算的顺序可能会改变累积误差)。