How to eliminate for-loop?

1 vue (au cours des 30 derniers jours)
Andreas Schwager
Andreas Schwager le 27 Juil 2016
Commenté : Andreas Schwager le 1 Août 2016
Hi to everybody,
in the for-loop below, is a multiplication of a scalar with twice a matrix column. If two vectors in a for-loop are multiplied it should be possible to reformulate it into a matrix multiplication. How to do this? The task is to speed up the processing, especially if dimensions of matrix are becoming large.
A = [1 2; 3 4]
B = [5 6 7; 8 9 10; 11 12 13]
C = [1 0 0; 0 2 0; 0 0 0]
for indx = 1:size(A,2)
D(indx,:,:) = C(indx,indx) .* A(:,indx) * B(:,indx)';
end
Thanks Andy

Réponse acceptée

Andrei Bobrov
Andrei Bobrov le 27 Juil 2016
Modifié(e) : Andrei Bobrov le 27 Juil 2016
A = [1 2; 3 4];
B = [5 6 7; 8 9 10; 11 12 13];
C = [1 0 0; 0 2 0; 0 0 0];
n = size(A,2);
Cd = diag(C);
D = bsxfun(@times,A,reshape(Cd(1:n),1,[]));
D = bsxfun(@times,D,permute(B(:,1:n),[3,2,1]));
D = permute(D,[2,1,3]);
  2 commentaires
Andreas Schwager
Andreas Schwager le 27 Juil 2016
Dear Andrei,
thanks for this answer!
However, if I do:
clear A B C D E F Cd n
A = [1 2; 3 4];
B = [5 6 7; 8 9 10; 11 12 13];
C = [1 0 0; 0 2 0; 0 0 0];
D = zeros(size(A,2),size(A,2),size(B,2));
for indx = 1:size(A,2)
D(indx,:,:) = C(indx,indx) .* A(:,indx) * B(:,indx)';
end
n = size(A,2);
Cd = diag(C);
E = bsxfun(@times,A,reshape(Cd(1:n),1,[]));
F = bsxfun(@times,E,permute(B(:,1:n),[3,2,1]));
D - F
... there are a couple of non zero elements. Your code ignores the last column of B.
Thanks! Andy
Andrei Bobrov
Andrei Bobrov le 27 Juil 2016
Thank you Stephen! I am corrected too.

Connectez-vous pour commenter.

Plus de réponses (1)

Stephen23
Stephen23 le 27 Juil 2016
Modifié(e) : Stephen23 le 27 Juil 2016
This gives the correct output, unlike the accepted answer:
>> N = size(A,2);
>> Cd = diag(C);
>> G = bsxfun(@times,A.',permute(B(:,1:N),[2,3,1]));
>> G = bsxfun(@times,Cd(1:N),G);
>> isequal(D,G)
ans = 1
  2 commentaires
Andrei Bobrov
Andrei Bobrov le 27 Juil 2016
+1
Andreas Schwager
Andreas Schwager le 1 Août 2016
Dear Stephen, Dear Andrei,
Thanks a lot for your support!

Connectez-vous pour commenter.

Catégories

En savoir plus sur MATLAB dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by