# How to vectorize a for loop but with conditionals inside it ?

2 views (last 30 days)
nah on 20 Sep 2013
How to vectorize a for loop but with conditionals in it ?
[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
nah on 23 Sep 2013
Yes, the above test Data with rand should work. If needed, I can post my data as well (possibly by email or git )

Jan on 20 Sep 2013
Edited: Jan on 21 Sep 2013
I assume that the bottleneck of your code is: exp(constantMatrix), because exp() is very expensive. So move this calculation out of the loops:
expConstantMatrix = exp(constantMatrix);
for ix = 2:length(col1)
...
anotherMatrixtoMultiply = diag( expConstantMatrix * col2(ix) );
Is this really wanted:
if (col1(ix) == 0 )
...
elseif (col1(ix) == 1 )
...
end
Or do you mean
if col1(ix) == 0
...
else
...
end
This might be the same in a standard case, but it is prone to bugs to add an elseif without an else.
[EDITED] Some tests show that this is faster:
anotherVectortoMultiply = expConstantMatrix * col2(ix);
cumulMatrixProduct = matrixToMultiply * bsxfun(@times, anotherVectortoMultiply, cumulMatrixProduct);
nah on 24 Sep 2013
Actually, the motivation was not to optimize this particular piece, but rather be able to do it in a parallel fashion especially as gpuArray for which converting vectorized code is easier than working with for loops. ( i have a parfor version of the code above, but getting to do such calculations en masse on GPUs is where am stuck )

### Categories

Find more on Loops and Conditional Statements in Help Center and File Exchange

### Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!