Array multiplication along certain dimension?
    40 views (last 30 days)
  
       Show older comments
    
    Visa Suomi
 on 21 Nov 2017
  
    
    
    
    
    Commented: Visa Suomi
 on 28 Nov 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 Comments
Accepted Answer
  David Goodmanson
      
      
 on 24 Nov 2017
        
      Edited: David Goodmanson
      
      
 on 24 Nov 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
More Answers (1)
  James Tursa
      
      
 on 27 Nov 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);
See Also
Categories
				Find more on Resizing and Reshaping Matrices in Help Center and File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!