0

for ループをベクトル化する方法ですが、その中に条件が含まれていますか? (主にMatlabで)

** 乗算する行列 ** がバイナリ値 ( 0 または 1) ** に基づいて選択され、別の行列と乗算されて反復ごとに更新される累積積を計算する for ループ。私は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 ) 

前もって感謝します。

4

1 に答える 1

1

ここでの問題は条件ではなく、ループの反復間にデータ依存性があるという事実です。これにより、単純なベクトル化を含む並列処理が妨げられます。たとえば、prod行列の乗算ではなく、行ごとに要素の積 (並列化可能!) を実行するため、この関数は役に立ちません。

私が気づいたことの 1 つは、col2(ix)すべてスカラーであり、ループから削除できることです。prod(col2(2:length(col1)))次に、最後に乗算し、anotherMatrixToMultiply各反復を変更しません。ただし、行列の乗算は可換ではないため、これをループの外に移動することはできません (線形代数の規則に従っている場合でも、浮動小数点演算の順序を変更すると累積誤差が変わる可能性があります)。

于 2013-09-20T13:40:48.063 に答える