如何对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 )
提前致谢。
答案 0 :(得分:1)
这里的问题不是条件,而是循环迭代之间存在数据依赖关系的事实。这可以防止并行处理,包括天真的矢量化。例如,prod
函数对您没有帮助,因为它每行执行元素产品(可并行化!),而不是矩阵乘法。
我注意到的一件事是col2(ix)
都是标量,可以从循环中删除。然后你最后乘以prod(col2(2:length(col1)))
,anotherMatrixToMultiply
不会改变每次迭代。但是,你不能将它移到循环之外,因为矩阵乘法不是可交换的(即使它是根据线性代数的规则,改变浮点运算的顺序可能会改变累积误差)。