Multiplying certain dimensions of two 3D matrices
6 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Michael
el 14 de Mayo de 2012
Editada: Comrun Yousefzadeh
el 17 de Jun. de 2020
Hi
I've got two matrices, one 30x30x50 and one 30x30x80
I would like to multiply them in such a way that the result is a 50x80 matrix ie. an implicit sum over all of the 30x30 common elements.
eg. A*B = C
C(k,l) = A(i,j,k)*B(i,j,l) summed over all i, j
Is there a simple way to write this? I would rather avoid complications using "reshape".
Thanks, Mike
0 comentarios
Respuesta aceptada
Andrei Bobrov
el 14 de Mayo de 2012
Idea of Sean de Wolski
C = squeeze(sum(sum(bsxfun(@times,a,permute(b,[1 2 4 3])))))
or
s = size(a)
C = squeeze(sum(bsxfun(@times,reshape(a,s(1)*s(2),[])',reshape(b,1,s(1)*s(2),[])),2))
1 comentario
Andrei Bobrov
el 14 de Mayo de 2012
Hi Michael! Thank you for "accpted", but Teja's variant is better than my.
Más respuestas (2)
Teja Muppirala
el 14 de Mayo de 2012
A = rand(30,30,50);
B = rand(30,30,80);
C = reshape(A,900,[])'*reshape(B,900,[]);
4 comentarios
Comrun Yousefzadeh
el 17 de Jun. de 2020
Editada: Comrun Yousefzadeh
el 17 de Jun. de 2020
I have a related questoin. I'm trying to multiply a two dimentioanl array to a specific dimension of a 3-D matrix. For example, A=2000*2000*72, B=72*3 and I'm trying to reach C=2000*2000*3. In other words B should be multiplied to the 3rd dimension of A and repeated (element wise) for 2000*2000 points in the first two dimensions. Currently I'm using a loop like this:
for ii=1:size(A,1)
for jj=1:size(A,2)
A1=A(ii,jj,:);
A1=A1(:);
C1=B'*A1; % C1 has dimension of 3*1
C2=D*C1; %D is a 3-3 matrix therefore, C2 has the same dimension as C1
C(ii,jj,:)=C2(:,1);
end
end
What is the better way to avoid the loop?
Thanks,
0 comentarios
Ver también
Categorías
Más información sobre Creating and Concatenating Matrices en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!