How can I average multiple matrices by element to create a new matrix of the same size?
171 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Patrick
el 2 de Oct. de 2013
Comentada: Image Analyst
el 18 de Jul. de 2022
I have 31 matrices, each of size 72x144, and each representing a day of the month of January. I would like to have a 32nd matrix, also of size 72x144, which includes the average value for each element in the original 31 matrices. For example, if I have:
A=[1,2,3|2,3,4|3,4,5] B=[2,3,4|3,4,5|4,5,6] C=[3,4,5|4,5,6|5,6,7]
I want:
D=[2,3,4|3,4,5|4,5,6] (the average by element of the originals)
What is the easiest way for me to do this? I have found a few threads here which have answers I don't really understand, as I am relatively unfamiliar with writing codes, for MATLAB or otherwise. I need something easy to understand.
Thanks, Patrick
2 comentarios
Respuesta aceptada
Image Analyst
el 2 de Oct. de 2013
meanMatrix = (matrix1 + matrix2 + matrix3 + .... etc...... + matrix 30 + matrix31)/31;
2 comentarios
Image Analyst
el 2 de Oct. de 2013
Editada: Image Analyst
el 2 de Oct. de 2013
If you don't already have them in arrays, then you can use the code in the FAQ to read in the arrays from a bunch of files: http://matlab.wikia.com/wiki/FAQ#How_can_I_process_a_sequence_of_files.3F
myFolder = 'C:\Documents and Settings\yourUserName\My Documents\My Data Files';
if ~isdir(myFolder)
errorMessage = sprintf('Error: The following folder does not exist:\n%s', myFolder);
uiwait(warndlg(errorMessage));
return;
end
filePattern = fullfile(myFolder, '*.txt');
txtFiles = dir(filePattern);
for k = 1:length(txtFiles)
baseFileName = txtFiles(k).name;
fullFileName = fullfile(myFolder, baseFileName);
fprintf(1, 'Now reading %s\n', fullFileName);
thisArray = csvread(fullFileName); % Or however you read them in.
if k == 1
sumArray = thisArray;
else
sumArray = sumArray
end
end
meanArray = sumArray / length(txtFiles);
Más respuestas (3)
Matt J
el 2 de Oct. de 2013
Read the matrices into the slices A(:,:,i) of a 3D array and do
Amean=mean(A,3);
0 comentarios
Tope Oyelade
el 20 de Abr. de 2021
Editada: Image Analyst
el 20 de Abr. de 2021
Just add a dot before the '/' as below and you are good to go!
meanMatrix = (matrix1 + matrix2 + matrix3 + .... etc...... + matrix30 + matrix31)./31
6 comentarios
Bruno Luong
el 18 de Jul. de 2022
Editada: Bruno Luong
el 18 de Jul. de 2022
@Sebastian Garzon Replace 0 with NaN the use 'omitnan' argumant
A(A==0) = NaN;
meanA = mean(A, 3, 'omitnan')
Or non destructive way:
meanA = sum(A,3) ./ sum(A~=0,3)
Image Analyst
el 18 de Jul. de 2022
@Sebastian Garzon with Bruno's way you'd need to create A as a 3-D matrix:
A = cat(3, matrix1, matrix2, matrix3, .... etc...... , matrix30, matrix31);
A(A==0) = NaN;
meanA = mean(A, 3, 'omitnan')
Here's another way:
countMatrix = (matrix1 ~= 0 + matrix2 ~= 0 + matrix3 ~= 0 + .... etc...... + matrix30 ~= 0 + matrix31 ~= 0);
sumMatrix = (matrix1 + matrix2 + matrix3 + .... etc...... + matrix30 + matrix31);
averageMatrix = sumMatrix ./ countMatrix;
Ver también
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!