Array multiplication along certain dimension?

93 visualizzazioni (ultimi 30 giorni)
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

Risposta accettata

David Goodmanson
David Goodmanson il 24 Nov 2017
Modificato: David Goodmanson il 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

Più risposte (1)

James Tursa
James Tursa il 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);
  1 Commento
Visa Suomi
Visa Suomi il 28 Nov 2017
Thanks, they work with smaller grids, but I encounter memory problems with my array sizes with these functions. My array A = 120 x 132 x 132 x 120.

Accedi per commentare.

Categorie

Scopri di più su Multidimensional Arrays in Help Center e File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by