Is there a way to vectorise this vector/matrix product?

1 vue (au cours des 30 derniers jours)
Daniel Pollard le 7 Mai 2021
I have a piece of code inside a for loop, which looks like
for k = 1:size(G, 1)
G(k) = real(W(:,k)' * R * W(:,k))
end
G is preallocated (which is how I know the length of it). W and R are 2D matrices (so W(:,k) is a vector). This loop is a real bottleneck in my code, that one line taking 90% of the total time that it takes to run a script which itself calls other functions and files. It's not possible to use a parfor loop as I'm already using one in a wrapper function.
Is there a way to vectorise that loop, in order to reduce the number of times the calculation is done? I'm sure it can be done, but it's not at all obvious to me.
0 commentairesAfficher -2 commentaires plus anciensMasquer -2 commentaires plus anciens

Connectez-vous pour commenter.

Réponse acceptée

Matt J le 7 Mai 2021
Modifié(e) : Matt J le 7 Mai 2021
G=real( sum((R*W).*conj(W),1) );
4 commentairesAfficher 2 commentaires plus anciensMasquer 2 commentaires plus anciens
Matt J le 7 Mai 2021
Here is a test of a agreement with random data:
N=5;
W=complex(rand(N),rand(N));
R=complex(rand(N),rand(N));
%%% Original method
G=nan(N,1);
for k = 1:size(G, 1)
G(k) = real(W(:,k)' * R * W(:,k));
end
Gbase=G;
%%% Proposed alternative
G=real( sum((R*W).*conj(W),1) ).';
Discrepancy=norm(G-Gbase,'fro')
Discrepancy = 1.9860e-15
Daniel Pollard le 7 Mai 2021
You're right, and I just came back to your answer to say that. Thank you!

Connectez-vous pour commenter.

Plus de réponses (1)

Bruno Luong le 7 Mai 2021
G = real(dot(W,R*W,1)).';
0 commentairesAfficher -2 commentaires plus anciensMasquer -2 commentaires plus anciens

Connectez-vous pour commenter.

Catégories

En savoir plus sur Loops and Conditional Statements dans Help Center et File Exchange

R2020a

Community Treasure Hunt

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

Start Hunting!

Translated by