MATLAB Answers

0

How can i load .mat files from subfolders with for loop?

Asked by Josef Bubendorfer on 2 Dec 2019 at 14:30
Latest activity Commented on by Josef Bubendorfer on 5 Dec 2019 at 2:07
I have a different number of .mat files in several folders, which I would like to import, plot data und save it in the same folder as a pdf file.
Here an example with two folders:
C:\Users\I2d1_4_1_1\
y3.mat
y4.mat
y5.mat
C:\Users\I5d1_4_1_1\
y3.mat
y4.mat
y5.mat
y6.mat
My two questions are:
  1. How do i save it in the same folder without changing the directory.
  2. How to adapt the code that i dont need to change the for loop i=3:5 for the first folder and i=3:6 for the second folder.
DataPath ='C:\Users\';
for i=3:60
for input=[2 5 8]
for delay=[4 8 12];
for delayinput=[1 4 8];
load([DataPath 'I%dd1_%d_1_%d\y' num2str(i) '.mat',input,delay,delayinput])
figure(1), plotregression(x, y);
SaveName = sprintf('NN_%d_1_%d',i,delay);
saveas(figure(1),fullfile(DataPath 'I%dd1_%d_1_%d', SaveName),'pdf')
end
end
end
end
Thanks for your help.

  0 Comments

Sign in to comment.

2 Answers

Answer by Walter Roberson
on 4 Dec 2019 at 0:13
 Accepted Answer

projectdir = 'C:\Users';
foldinfo = dir( fullfile(projectdir, 'I*') );
foldinfo(~[foldinfo.isdir]) = []; %get rid of I* that are not folders
foldnames = fullfile(projectdir, {foldinfo.name});
numfold = length(foldnames);
for didx = 1 : numfold
thisfold = foldnames{didx};
dinfo = dir(fullfile(thisfold, 'y*.mat'));
filenames = fullfile(thisfold, {dinfo.name});
numfiles = length(filenames);
for fidx = 1 : numfiles
thisfile = filenames{fidx};
datastruct = load(thisfile);
x = datastruct.x; y = datastruct.y;
and do your thing
end
end

  5 Comments

Thank you. But the following line is producing an error.
[~, fold_name_only] = basename(thisfold);
Undefined function 'basename' for input arguments of type 'char'.
I am using Matlab 2014a. Maybe because of that?
[~, fold_name_only] = fileparts(thisfold);
It was a mistake on my part. Too many years of working with too many languages.
Now that is working but the line drawnow ratelimit gives an error as unknown command option.
I am really thankfull for your work.

Sign in to comment.


Answer by Akira Agata
on 3 Dec 2019 at 0:01

How about using dir function?
Using the function, the solution would be like this:
fileList = dir('C:\Users\**\*.mat');
for kk = 1:numel(fileList)
filePath = fullfile(fileList(kk).folder,fileList(kk).name);
load(filePath);
h = figure;
plotregression(x,y);
saveName = replace(fileList(kk).name,'.mat','.pdf');
saveas(h,fullfile(fileList(kk).folder,saveName));
close(h);
end

  6 Comments

Thanks for your help. I am usind Matlab 2014a and there the dir funktion this way is not working I think. Sry for the inaccurate question again.
Then, you should change the first line to:
fileList = dir('C:\Users\I2d1_4_1_1\*.mat');
and change the fileList(kk).folder to 'C:\Users\I2d1_4_1_1\'.
Then, please do the same thing to the other folder C:\Users\I5d1_4_1_1\.
OK, thanks. Thats what i more or less already do, but if there is no "automatical" way to do it I have to go on like this. But thanks for the help and your ideas.

Sign in to comment.