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

1 vote

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

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

1 vote

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 Coder dans Centre d'aide et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by