How to vectorize a for loop but with conditionals inside it ?
이전 댓글 표시
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
Azzi Abdelmalek
2013년 9월 20일
Is this a complete code?
nah
2013년 9월 20일
Jan
2013년 9월 20일
@nah: Vectorizing is not trivial. Inserting a bug by a typo is as easy and suggesting a method is is much slower than the original version due to the need of huge temporary arrays. Therefore questions about improving the speed require testdata, e.g. created by rand() if this is meaningful, such that we can run and test our ideas before posting.
Should we add this:
matrixToMultiply = rand(101, 101);
constantMatrix = rand(101, 1 );
anotherMatrixtoMultiply = rand(101, 101 );
cumulMatrixProduct = zeros(101, 1); % Pre-allocation?!
nah
2013년 9월 23일
답변 (1개)
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
nah
2013년 9월 23일
Jan
2013년 9월 23일
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
2013년 9월 24일
카테고리
도움말 센터 및 File Exchange에서 Creating and Concatenating Matrices에 대해 자세히 알아보기
제품
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!