How to eliminate for-loop?

1 Ansicht (letzte 30 Tage)
Andreas Schwager
Andreas Schwager am 27 Jul. 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

Akzeptierte Antwort

Andrei Bobrov
Andrei Bobrov am 27 Jul. 2016
Bearbeitet: Andrei Bobrov am 27 Jul. 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 Kommentare
Andreas Schwager
Andreas Schwager am 27 Jul. 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 am 27 Jul. 2016
Thank you Stephen! I am corrected too.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

Stephen23
Stephen23 am 27 Jul. 2016
Bearbeitet: Stephen23 am 27 Jul. 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 Kommentare
Andrei Bobrov
Andrei Bobrov am 27 Jul. 2016
+1
Andreas Schwager
Andreas Schwager am 1 Aug. 2016
Dear Stephen, Dear Andrei,
Thanks a lot for your support!

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu MATLAB finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by