Fast matrix multiplication in loop

7 Ansichten (letzte 30 Tage)
Batuhan
Batuhan am 7 Feb. 2014
Bearbeitet: Matt J am 7 Feb. 2014
Dear All,
I have two matrices with dimensions 3x3 and E6x3. I need to multiply each row of the latter with the former. It's like
a=rand(3,3);
b=(1000000,3);
for i=1:size(b,1)
c=a*b(i,:)';
end
However, this step takes hours to be done. I wonder if there is any faster way to do this.
Cheers.
  1 Kommentar
Jos (10584)
Jos (10584) am 7 Feb. 2014
element-by-element or matrix multiplications?

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Azzi Abdelmalek
Azzi Abdelmalek am 7 Feb. 2014
Bearbeitet: Azzi Abdelmalek am 7 Feb. 2014
a=rand(3,3);
b=rand(100,3);
n=size(a,2);
m=size(b,1);
c=zeros(m,n);
for i=1:size(b,1)
c(i,:)=a*b(i,:)';
end
%or simply
c=(a*b')'

Weitere Antworten (2)

Jos (10584)
Jos (10584) am 7 Feb. 2014
Two options:
1. pre-allocate C to avoid memory allocation in each iteration
C = zeros(N, ..) % pre-allocation
for k = 1:N,
C(k,:) = ..
end
2. Use BSXFUN
  1 Kommentar
Batuhan
Batuhan am 7 Feb. 2014
Thank you. But I'm not sure if bsxfun is the right one, since
C=bsxfun(@times,a*b) results in
Error using bsxfun Non-singleton dimensions of the two input arrays must match each other.

Melden Sie sich an, um zu kommentieren.


Batuhan
Batuhan am 7 Feb. 2014
Thank you all. Really, preallocation was the issue and fixes it.
  1 Kommentar
Matt J
Matt J am 7 Feb. 2014
Bearbeitet: Matt J am 7 Feb. 2014
No, it's crazy to do this with a loop, pre-allocated or otherwise. Just do c=b*a', as Azzi noted.

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Loops and Conditional Statements 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