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

1 Ansicht (letzte 30 Tage)
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 Kommentar
Stephen23
Stephen23 am 22 Aug. 2018
Bearbeitet: Stephen23 am 22 Aug. 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))

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Walter Roberson
Walter Roberson am 27 Jul. 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 Kommentare
Walter Roberson
Walter Roberson am 30 Jul. 2018
I thought that was what my code did? What changes did you have to make?
Daianne Hofig
Daianne Hofig am 1 Dez. 2018
I had the same problem, and his code worked super smoothly! Thank you!

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Community Treasure Hunt

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

Start Hunting!

Translated by