How can I vectorize this loop?
1 visualizzazione (ultimi 30 giorni)
Mostra commenti meno recenti
I am trying to remove a loop from my code without using repmat.
A and B are matrices that have the same number of rows, say m. Otherwise they have arbitrary column size.
Let
The loop I want to vectorize.
k = size(A, 2);
l = size(B, 2);
for t = 1:m
ARP = ARP + A(t,:)' * B(t,:)
end
Which is a sum of matrices size (kX1)X(1Xl) = kXl. I actually want the average so:
ARP = (1/m) * ARP
So far I have tried using repmat which balloons up the size of my matrices and in fact fails when the matrices get largish.
%Create copies of A stacked on top of each other to a depth of l
exA = repmat(A, l, 1); % (m * k)Xl
%Reshape it so that exA has each column of A cloned k times
exA = reshape(exA, m, k * l); % mX(k * l)
%Create copies of B stacked next to each other to a width k
exB = repmat(B, 1, k); % mX(l * k)
%Both matrices are now m X k*l so we can element-wise multiply
%and take the mean of the rows.
ARP = mean(exA .* exB, 1); % 1X(k * l)
ARP = reshape(ARP, l, k)';
I am also aware that repmat can be replaced in vectorizations with bsxfun, although it is not clear how to implement bsxfun in this case. I appreciate any help that gets me to an optimized solution and also illustrates techniques for vectorization that I can study for similar problems.
Thanks in advance Mike
0 Commenti
Risposta accettata
Jian Wei
il 30 Lug 2014
Please try the following code to see if it gives you the same result as your code.
ARP = (1/m)*A'*B;
0 Commenti
Più risposte (1)
Andrei Bobrov
il 30 Lug 2014
Modificato: Andrei Bobrov
il 30 Lug 2014
ARP = mean(bsxfun(@times,permute(A,[2,3,1]),permute(B,[3,2,1])),3);
or
ARP = squeeze(mean(bsxfun(@times,A,reshape(B,size(B,1),1,[]))));
0 Commenti
Vedere anche
Categorie
Scopri di più su Matrix Indexing in Help Center e File Exchange
Prodotti
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!