How to sum up multiple matrices, element by element

So I've got multiple 100x100 matrices saved as a multidimensional Array a. Now I want to sum them up, element by element so the result is one 100x100 matrix. Since I got n matrices, I want to have a loop or similar, so I don't have to call every matrix by name like A1 + A2 + A3 + A4 ... = A. Example:
A =
1 1 1
2 2 2
3 3 3
B =
4 4 4
5 5 5
6 6 6
C =
7 7 7
8 8 8
9 9 9
D = [Some magical loop]
D =
12 12 12
15 15 15
18 18 18

1 comentario

Stephen23
Stephen23 el 10 de Nov. de 2017
Editada: Stephen23 el 10 de Nov. de 2017
Your question contradicts itself: do you either have "as a multidimensional Array a" or do you have lots of separate matrices named "A1 + A2 + A3 + A4 ... " ?
If you have one ND array then you do not need lots of separate arrays. If you have lots of separate arrays then you really need one ND array!

Iniciar sesión para comentar.

 Respuesta aceptada

Jan
Jan el 11 de Nov. de 2017
Editada: Jan el 11 de Nov. de 2017
If you really have a list of variables A1, A2, A3: This is a bad idea and impedes using the data. Prefer a multi-dimensional array A(m, n, k). Then the sum is trivial:
A = cat(3, ...
[1 1 1; ...
2 2 2; ...
3 3 3], ...
[4 4 4; ...
5 5 5; ...
6 6 6], ...
[7 7 7; ...
8 8 8; ...
9 9 9]);
D = sum(A, 3);

8 comentarios

Kuba
Kuba el 11 de Nov. de 2017
Thank you, that was my first thought of using 'sum', but I was missing the example on the matworks side for 'sum' with dimension 3.
Since you said you've already done the concatenation cat(3, a1,a2,etc) and "saved as a multidimensional Array a." you'd simply do
sumMatrix = sum(a, 3);
I'd encourage you not to make your code look like an alphabet soup of single letter variable names and use more descriptive names than "a". Since Jan's code solved your question, can you please "Accept this answer" by clicking on the link?
What if i havent done the concatenation?
Jan
Jan el 6 de Feb. de 2019
@Jairo: If you haven't done the concatenation yet, do it now. What is your problem?
Is it also possible to build the sum only over a specific range of "pages" in the third dimension? I couldn't find any solution for this. For example, I have a multidimensional array "Spectra" of size (256 * 2048 * 26) and depending on the user input I want to build the sum over all values in the first and second dimension but only e.g. from page 3-6 in the third dimension.
Jan
Jan el 14 de Mzo. de 2022
Editada: Jan el 14 de Mzo. de 2022
Do you mean this:
x = rand(256, 2048, 26);
y = sum(x(:, :, 3:6), 'all')
% or
y = sum(x(:, :, 3:6), 3)
Thank you so much!
Jan
Jan el 15 de Mzo. de 2022
You are welcome.

Iniciar sesión para comentar.

Más respuestas (1)

Birdman
Birdman el 10 de Nov. de 2017
Editada: Birdman el 10 de Nov. de 2017
A(:,:,1)=randi([1 3],100,100);
A(:,:,2)=randi([1 3],100,100);
A(:,:,3)=randi([1 3],100,100);
A(:,:,4)=randi([1 3],100,100);
B=zeros(size(A,1),size(A,2));
for i=1:size(A,3)
B=B+A(1:size(A,1),1:size(A,2),i);
end
disp(B)

2 comentarios

Kuba
Kuba el 10 de Nov. de 2017
Thanks a lot, it works perfectly!!
Note that
B = B + A(1:size(A,1),1:size(A,2),i);
can be processed much more efficient when written as:
B = B + A(:, :, i);
But the complete code can be simplified to:
A = randi([1 3], 100, 100, 4);
B = sum(A, 3);

Iniciar sesión para comentar.

Categorías

Preguntada:

el 10 de Nov. de 2017

Comentada:

Jan
el 15 de Mzo. de 2022

Community Treasure Hunt

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

Start Hunting!

Translated by