How do I concatenate 3D arrays from multiple .mat files?

2 visualizaciones (últimos 30 días)
I have 360 archives.mat, each with a variable 'A', of size 1800x400x1. I would like to concatenate these arrays in the third dimension, ie I would like an 'A1' of size 1800x400x360. For this I tried two things: 1) I used the 'cat' command (as in the code below), but it just saved the last array:
d=dir('test/*.mat');%test is the name of my directory where these files are stored
nn=length(d);
A1=[];
for ii=1:nn
eval(['load teste/',d(ii).name])
disp(d(ii).name)
A1=cat(3,A);
end
2) I tried to use [], but it only concatenates in the first or second dimension:
d=dir('test/*.mat');
nn=length(d);
A1=[];
for ii=1:nn
eval(['load test/',d(ii).name])
disp(d(ii).name)
A1=[A1;A];
end
Anyone have any suggestions on how to solve this? Thanks.
  1 comentario
Stephen23
Stephen23 el 22 de Ag. de 2018
Editada: Stephen23 el 22 de Ag. de 2018
Note that eval does nothing useful here at all, except to complicate the code and make debugging harder. All you need is:
load(...)
Or even better:
S = load(...)
For example:
S = load(fullfile('test',d(ii).name))

Iniciar sesión para comentar.

Respuesta aceptada

Walter Roberson
Walter Roberson el 27 de Jul. de 2018
A1 = cat(3, A1, A);
but you could also use
A1(:,:,ii) = A;
and you could pre-allocated, like
d=dir('test/*.mat');%test is the name of my directory where these files are stored
nn=length(d);
for ii=1:nn
eval(['load teste/',d(ii).name])
disp(d(ii).name)
if ii == 1
A1 = zeros(size(A,1), size(A,2), nn);
end
A1(:, :, ii) = A;
end
However, you should avoid using eval:
projectdir = 'test';
d = dir( fullfile(projectdir, '*.mat') );
nn = length(d);
for ii=1:nn
load( fullfile(projectdir, d(ii).name) )
disp(d(ii).name)
if ii == 1
A1 = zeros(size(A,1), size(A,2), nn);
end
A1(:, :, ii) = A;
end
and you should avoid using load() without any output:
projectdir = 'test';
d = dir( fullfile(projectdir, '*.mat') );
nn = length(d);
for ii=1:nn
datastruct = load( fullfile(projectdir, d(ii).name), 'A' );
A = datastruct.A;
disp(d(ii).name)
if ii == 1
A1 = zeros(size(A,1), size(A,2), nn);
end
A1(:, :, ii) = A;
end
  7 comentarios
Walter Roberson
Walter Roberson el 30 de Jul. de 2018
I thought that was what my code did? What changes did you have to make?
Daianne Hofig
Daianne Hofig el 1 de Dic. de 2018
I had the same problem, and his code worked super smoothly! Thank you!

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Logical 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!

Translated by