Borrar filtros
Borrar filtros

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

1 visualización (últimos 30 días)
nah
nah el 20 de Sept. de 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
  5 comentarios
Jan
Jan el 20 de Sept. de 2013
Editada: Jan el 20 de Sept. de 2013
@Readers: Is there a faster was to calculate A * diag(x) * B? I cannot test if A * bsxfun(@times, x, B) is faster than the BLAS librarie's DGEMM with the full matrix.
nah
nah el 23 de Sept. de 2013
Yes, the above test Data with rand should work. If needed, I can post my data as well (possibly by email or git )

Iniciar sesión para comentar.

Respuestas (1)

Jan
Jan el 20 de Sept. de 2013
Editada: Jan el 21 de Sept. de 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);
  3 comentarios
Jan
Jan el 23 de Sept. de 2013
If the multiplications of the matrices are the main work, a vectorization of the loop will not be useful. If large temporary arrays must be created, vectorized code can be slower than the loops. So do not try to optimize code, which is not the bottleneck.
nah
nah el 24 de Sept. de 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 )

Iniciar sesión para comentar.

Categorías

Más información sobre Loops and Conditional Statements en Help Center y File Exchange.

Productos

Community Treasure Hunt

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

Start Hunting!

Translated by