loop over subfolders and saving cat parameters
1 次查看(过去 30 天)
显示 更早的评论
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.
0 个评论
采纳的回答
Stephen23
2019-11-28
编辑:Stephen23
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 个评论
Stephen23
2019-11-29
编辑:Stephen23
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 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Startup and Shutdown 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!