MATLAB Answers

loop over subfolders and saving cat parameters

2 ビュー (過去 30 日間)
adi kul
adi kul 2019 年 11 月 28 日
編集済み: Stephen 2019 年 11 月 29 日
Hello All,
I am trying to run my code over sub folder but facing issues. I am trying to extrac perticular variable from multiple .mat files.
I could do that for 1 folder having multiple .mat files with following code:
clear all
close all
d = uigetdir();
filePattern = fullfile(d, '*.mat');
file = dir(filePattern);
x = cell(1, numel(file));
for k = 1: numel(file)
baseFileName = file(k).name;
fullFileName = fullfile(d, baseFileName);
fprintf('Now Reading file %s\n', fullFileName);
x{k}=load(fullFileName,'Veriable1');
j{k}=cell2mat(struct2cell(x{k}));
end
var1=cat(1,j{:});
Now I am trying to run this over the loop for subfolder and now facing issues and need help
Here is my current try:
clear all
close all
D = 'myPath';
S = dir(fullfile(D,'*'));
N = setdiff({S([S.isdir]).name},{'.','..'}); % list of subfolders of D.
for ii = 1:numel(N)
T = dir(fullfile(D,N{ii},'*.mat')); % improve by specifying the file extension.
C = {T(~[T.isdir]).name}; % files in subfolder.
for jj = 1:numel(C)
filePattern = fullfile(D,N{ii},C{jj})
%filePattern = fullfile(F, '*.mat');
file = dir(filePattern);
x = cell(1, numel(file));
for k = 1: numel(file)
baseFileName = file(k).name;
fullFileName = fullfile(D,N{ii}, baseFileName);
fprintf('Now Reading file %s\n', fullFileName);
x{k}=load(fullFileName,'Veriable1');
j{k}=cell2mat(struct2cell(x{k}));
end
end
end
var1=cat(1,j{:});
I know it has many flaws but I am not at all able to think further and need help to make it work.

採用された回答

Stephen
Stephen 2019 年 11 月 28 日
編集済み: Stephen 2019 年 11 月 28 日
If you only need to loop over subfolders then why are you using three loops? One loop for the subfolders, one loop for the files... it is not clear what the third loop is supposed to achieve.
Also you do not explain if each folder only contains one .mat file or multiple .mat files, which will make a large difference to the design of your code.
Something like this will get you started:
D = 'C:\Software\Data\EDP\Rotation_3_CES_OBD\Script_for_data_analysis\19-11_matfiles\Try_subf';
S = dir(fullfile(D,'*'));
N = setdiff({S([S.isdir]).name},{'.','..'}); % list of subfolders of D.
for ii = 1:numel(N)
T = dir(fullfile(D,N{ii},'*.mat')); % improve by specifying the file extension.
T([T.isdir]) = [];
for jj = 1:numel(T)
F = fullfile(D,N{ii},T(jj).name)
fprintf('Now Reading file %s\n',F);
Z = load(F,'Key_swtich');
T(jj).data = Z.Key_switch;
end
S(ii).data = vertcat(T.data);
end
X = vertcat(S.data)
  10 件のコメント
Stephen
Stephen 2019 年 11 月 29 日
"I meant somehting like this...not able to make it work though!"
And yet you don't explain enough for me to help you.
How does Variables correspond to the files in each subfolder? You defined Variables with two elements, and then within the inner loop access those two elements using indexing, so this means according to your indexing, each subfolder contains at most two .mat files, which each contains at least one variable (whose name is that of the corresponding element of Variables).
I cannot tell if that is correct, because you have not explained how Variables should correspond to each subfolder or file loop iteration, if at all.
Your code also assumes that every subfolder contains .mat files with the same variables in the same order, something like this:
Variables = {'A','B'}
sub1/f1.mat -> A
sub1/f2.mat -> B
sub2/f1.mat -> A
sub2/f2.mat -> B
etc.
Again, I cannot tell if your code matches how your files are arranged, because you have not explained how the file variables repeat, if at all.
You could easily read all of the variables into a cell array or structure, but as you earlier dismissed this idea beacuse "that makes the process very slow if I have huge number of varaibles"'.
If you want more help please give a detailied explanation of how the subfolders, files, and variable names correspond, e.g. like the list I gave above.

サインインしてコメントする。

その他の回答 (0 件)

Community Treasure Hunt

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

Start Hunting!

Translated by