How to multiply two matrices

2 Ansichten (letzte 30 Tage)
carlas
carlas am 24 Nov. 2011
Hello,
For example I would like to multiply the following two matrices:
A = rand([10,10,10]);
B = rand([10,10,10]);
defined by:
for i=1:size(A,3)
C(:,:,i)= A(:,:,i)*B(:,:,i);
end
The question is: is this possible without the use of a for loop? Kind regards, Carlas
  2 Kommentare
umar siyab
umar siyab am 24 Nov. 2011
no its not possible without the use of loop because u have to multiply every element in the matrix with other matrix..
Jan
Jan am 24 Nov. 2011
What are the real dimensions in your problem? It matters if size(A, 3) is much larger or much smaller than size(A, 1) and size(A, 2).

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Andrei Bobrov
Andrei Bobrov am 24 Nov. 2011
[m n p]= size(A);
o1 = ones(p,1));
out = cell2mat(cellfun(@mtimes,mat2cell(A,m,n,o1),mat2cell(B,m,n,o1),'un',0));
ADD
[m,n,p] = size(A);
out0 = bsxfun(@times,reshape(A,m,[]),reshape(permute(B,[1 3 2]),1,[],n));
out = reshape(sum(reshape(permute(out0,[1 3 2]),m,m,n,[]),3),m,n,[]);
or for out
out = permute(blockproc(out0,[m n],@(block_struct)sum(block_struct.data,2)),[1 3 2]);

Weitere Antworten (3)

Titus Edelhofer
Titus Edelhofer am 24 Nov. 2011
Hi Carlas,
probably yes. But in this case probably the loop is not your worst option, as long as you initialize
C = zeros(size(A,2), size(B,1), size(A,3));
before the loop.
Titus
  1 Kommentar
Jan
Jan am 24 Nov. 2011
I do not completely agree with you, Titus: Instead of "not the worst" I'd claim, it is at least "very good". +1
James Tursa's MTIMESX (http://www.mathworks.com/matlabcentral/fileexchange/25977-mtimesx-fast-matrix-multiply-with-multi-dimensional-support ) can handle such tasks efficiently.

Melden Sie sich an, um zu kommentieren.


carlas
carlas am 24 Nov. 2011
A = rand([10,10,10]);
[m n p]= size(A);
tic
o1 = ones(p,1);
out = cell2mat(cellfun(@mtimes,mat2cell(A,m,n,o1),mat2cell(A,m,n,o1),'un',0));
t1 = toc;
tic
C = zeros([10,10,10]);
for i=1:size(A,3)
C(:,:,i) = A(:,:,i)'*A(:,:,i);
end
t2 = toc;
xFaster = t2/t1
xFaster =
0.5072
The for loop is faster. Based on the above answers I assume that the for loop is the most optimal implementation if the final matrix is initialized. However, it is possible to do without.
  1 Kommentar
Jan
Jan am 24 Nov. 2011
I definitely prefer the loop. Especially for large inputs it has a much smaller memory footprint than the CELL method. For A=rand(100,100,1000) the loop is 3 times faster.

Melden Sie sich an, um zu kommentieren.


carlas
carlas am 24 Nov. 2011
Thanks Titus and Andrei!

Kategorien

Mehr zu Loops and Conditional Statements finden Sie in Help Center und File Exchange

Tags

Community Treasure Hunt

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

Start Hunting!

Translated by