Array multiplication along certain dimension?
    39 visualizaciones (últimos 30 días)
  
       Mostrar comentarios más antiguos
    
    Visa Suomi
 el 21 de Nov. de 2017
  
    
    
    
    
    Comentada: Visa Suomi
 el 28 de Nov. de 2017
            I have a 4-D array with dimensions A = A1 x A2 x A3 x N and a vector with dimensions V = 1 x N. I would like to multiply each element in the array A with vector V along fourth dimension and take a sum along the same dimension to form a matrix B = A1 x A2 x A3. Currently I am using a loop to achieve this, but is there any faster method to achieve the same result? Thanks!
A1 = 3;
A2 = 3;
A3 = 3;
N = 10;
A = ones(A1, A2, A3, N);
V = ones(1, N);
B = NaN(A1, A2, A3);
for i = 1:A1
for j = 1:A2
for k = 1:A3
  B(i,j,k) = squeeze(A(i,j,k,:))' * V';
end
end
end
0 comentarios
Respuesta aceptada
  David Goodmanson
      
      
 el 24 de Nov. de 2017
        
      Editada: David Goodmanson
      
      
 el 24 de Nov. de 2017
  
      Hi Visa,
This seems to work
A1 = 2;
A2 = 3;
A3 = 4;
N =  7;
A = rand(A1, A2, A3, N);
V = rand(1, N);
% ---- method 1
B1 = NaN(A1, A2, A3);
for i = 1:A1
  for j = 1:A2
    for k = 1:A3
      B1(i,j,k) = squeeze(A(i,j,k,:))' * V';
    end
  end
end
% ---- method 2
D = permute(A,[4 1 2 3]);
E = reshape(D,N,A1*A2*A3);
F = V*E;
B2 = reshape(F,A1,A2,A3);
max(max(max(max(abs(B1-B2)))))     ans = 8.8818e-16
Más respuestas (1)
  James Tursa
      
      
 el 27 de Nov. de 2017
        Another way:
B = sum(bsxfun(@times,A,reshape(V,1,1,1,numel(V))),4);
Or in later versions of MATLAB:
B = sum(A.*reshape(V,1,1,1,numel(V)),4);
Ver también
Categorías
				Más información sobre Resizing and Reshaping 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!