Vectorizing/speeding up bsxfun multiplication-loop

2 Ansichten (letzte 30 Tage)
PetterS
PetterS am 12 Apr. 2015
Kommentiert: PetterS am 12 Apr. 2015
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

Akzeptierte Antwort

Roger Stafford
Roger Stafford am 12 Apr. 2015
Bearbeitet: Roger Stafford am 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'.
  1 Kommentar
PetterS
PetterS am 12 Apr. 2015
The first suggestion works like a dream! Thank you so much.
(the second one was also faster than my version but it caused a huge memory usage spike of about 10 Gb to run which I can’t afford)

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Kategorien

Mehr zu Matrix Indexing 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