Vectorizing/speeding up bsxfun multiplication-loop
1 visualizzazione (ultimi 30 giorni)
Mostra commenti meno recenti
I have a situation that looks like this:
C=zeros(1440,181,8);
for i=1:8
C(:,:,i)=sum(bsxfun(@times,A(:,:,31:end),reshape(B(:,i),1,1,[])),3);
end
Where A is of size=1440x181x2251 and B size=2221x8.
What I want to do is simply perform an element wise multiplication between A(:,:,31:end) and all the rows of the i’th column in B and then store the summation of the third dimension of this in C depending on the address of i. This seemingly simple command is destroying the runtime of my script and I can’t really figure out how to speed it up by avoiding the for loop. I tried replacing the for loop by a parfor to do several loops at the same time but I immediately run out of memory when I try that so it doesn’t work.
Any suggestions?
Thanks
0 Commenti
Risposta accettata
Roger Stafford
il 12 Apr 2015
Modificato: Roger Stafford
il 12 Apr 2015
You can try these to see which, if either, is faster than your current method:
C = reshape(reshape(A(:,:,31:end),[],2221)*B,1440,181,8);
or
C = reshape(reshape(A(1440*181*30+1:end),[],2221)*B,1440,181,8);
They should both give the same result as your code. The idea here is to convert to two-dimensional matrix multiplication and then reshape the result back to a three dimensional array, with the hope that Mathworks' matrix multiplication is more efficient than the combined action of 'sum' and 'bsxfun'.
Più risposte (0)
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!