load several .mat files with n x n matrices and compute average
1 visualización (últimos 30 días)
Mostrar comentarios más antiguos
Michael02139
el 13 de Oct. de 2016
Comentada: Michael02139
el 13 de Oct. de 2016
Hi there,
I'm new to working with matlab. I have experience with bash shell scripts. I have a bunch of .mat files that contain n x n matrices like this toy example:
>> load('matrix1.mat')
>> load('matrix2.mat')
>> m1
m1 =
1 2 3
2 1 5
3 6 1
>> m2
m2 =
1 3 5
2 1 5
4 9 1
I have two questions:
1. How can I automatically loop through -say- 100 of these to load them into matlab?
2. If they are loaded (in some way), how can I perform calculations on the cells in the matrices such as computing the average across them? In the example below I'm looking for
mAVG =
1 2.5 4
2 1 5
3.5 7.5 1
Thanks so much!
0 comentarios
Respuesta aceptada
Walter Roberson
el 13 de Oct. de 2016
If the variables are all the same 2D size, then the most efficient thing to do is load them one at a time and store the value into a slice of an array. Then once you have all of the data loaded, you can mean() across the third dimension.
dinfo = dir('matrix*.mat');
nfile = length(dinfo);
if nfile == 0
avg = [];
warning('There were no input files');
else
filestruct = load(dinfo(1).name);
fn = fieldnames(filestruct);
thisvar = filestruct.(fn{1});
orig_size = size(thisvar);
input_data = [thisvar(:), zeros(numel(thisvar), nfile-1, class(thisvar))];
for K = 2 : nfile
filestruct = load(dinfo(K).name);
fn = fieldnames(filestruct);
thisvar = filestruct.(fn{1});
if ~isequal(size(thisvar), orig_size)
error('file "%s" has a different size of matrix than the first file "%s"', dinfo(K).name, dinfo(1).name);
end
input_data(:,K) = thisvar(:);
end
input_data = reshape(input_data, [orig_size, nfile]);
avg = mean(input_data, ndim(input_data));
end
(with data of an unknown number of dimensions, it turned out to be easiest to store the data as columns and reshape afterwards.)
4 comentarios
Walter Roberson
el 13 de Oct. de 2016
Yes, sorry, MATLAB is inconsistent between nelem (no 's') and 'ndims' (with 's'), and I keep getting them wrong because of that.
Más respuestas (0)
Ver también
Categorías
Más información sobre Matrix Indexing 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!