how to average multiple folders with multiple files. I am attaching three folders with two files each. I need a help to find an average of two files from three folders. My code is showing an error"Dot indexing is not supported for variables "
1 次查看(过去 30 天)
显示 更早的评论
MS
2020-3-30
close all
clear all
D = 'D:\filename\';
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},'*')); % improve by specifying the file extension.
C = {T(~[T.isdir]).name}; % files in subfolder.
for jj = 1:numel(C)
F = fullfile(D,N{ii},C{jj})
fprintf('test%s\n',F);
S(ii).data = F(:);
end
end
Y = cat(3,S(:))%this line is wrong
out = mean(Y,3)
3 个评论
MS
2020-3-30
Thanks. I need two files(test_001.txt, test_002,txt) from all three folders(out of six files) finally. let me know if you need further clarifications.
MS
2020-3-30
code through N(here 3 folders) different folders with M(two files here) different.txt files(text001.txt.....text002.txt) with (O rows and P columns). and find the average(text001.txt.....text002.txt)of M different files from the N folders.
采纳的回答
Ameer Hamza
2020-3-30
Create a script in the same directory where you have folders T1, T2, and T3. Then paste the following code in that script and run it
files = dir('**/*.txt');
data = cell(1, numel(files));
for i=1:numel(files)
filename = fullfile(files(i).folder, files(i).name);
data{i} = readmatrix(filename);
end
M = cat(3, data{:});
average_val = mean(M, 3);
22 个评论
MS
2020-3-30
Thanks for the answer. Your code does the average of all six files all together. But, I need you to help me to get avearge of test_001.txt from all three folders and text_002.txt for all three folders and give it as two diffrent files(avg_value1.txt, averagevalue2.txt.).
Ameer Hamza
2020-3-30
编辑:Ameer Hamza
2020-4-4
In that case, try this
files = dir('**/*.txt'); % get names of all the files recursively.
% get the location of current directory to exclude all the files in it
current_dir = pwd;
idx = strcmp(current_dir, {files.folder});
files(idx) = []; % remove the files in current directory from the list
% place all the files with same name in a group
grps = findgroups({files.name});
filegrps = splitapply(@(x) {x}, files, grps');
avg_mat = cell(1,numel(filegrps));
for i=1:numel(filegrps)
grp = filegrps{i};
data = [];
for j=1:numel(grp)
filename = fullfile(grp(j).folder, grp(j).name); % construct the full path of the files
if isempty(data)
data = readmatrix(filename);
else
data = data + readmatrix(filename); % read the matrix and add to previously available values
end
end
avg_mat{i} = data/numel(grp); % calculate the aerage.
end
for i=1:numel(avg_mat)
figure();
axes();
hold on
view(3)
x = avg_mat{i}(:,1);
y = avg_mat{i}(:,2);
u = avg_mat{i}(:,3);
v = avg_mat{i}(:,4);
plot3(x, y, u, '+');
plot3(x, y, v, '*');
legend({'u', 'v'});
writematrix(avg_mat{i}, ['avg_val_' num2str(i)]);
end
Ameer Hamza
2020-3-30
OP's comment moved here:
Many thanks. This code is givng me four files instead of two files for some reason, Can you please check this.
Ameer Hamza
2020-3-30
Check the update code. It will only create 4 files after you run the code 2nd time, because new there are two new txt file. I have updated the code to exclude those files.
MS
2020-3-31
thanks. is there way to save all the average files output as mat files. Sorry, i am asking too much. kindly let me know if you can.
Ameer Hamza
2020-3-31
Yes it can be done by just changing the last for loop
for i=1:numel(avg_mat)
Avg_mat = avg_mat{i};
save(['avg_val_' num2str(i)], 'Avg_mat');
end
Ameer Hamza
2020-3-31
You can add as many line as you want like this:
for i=1:numel(avg_mat)
Avg_mat = avg_mat{i};
name = ['avg_val_' num2str(i)];
writematrix(Avg_mat, name); % .txt
save(name, 'Avg_mat'); % .mat
dlmwrite([name '.dat'], Avg_mat); % .dat
end
Ameer Hamza
2020-3-31
Maybe try this: https://www.mathworks.com/learn/tutorials/matlab-onramp.html. This is a tutorial created by Mathworks and gives a brief overview of basics on MATLAB.
MS
2020-4-3
@Ammer Hamza, I request you to please check and modify the code. The current code is giving the answer as first folder files instead of averaging the three folder files.
Ameer Hamza
2020-4-4
There were a few mistakes in my code. Please check the updated code in the second comment of this answer.
MS
2020-4-4
Many Thanks. you have been really helpful to me. Now, the code works fine. I request you to comment the code. It will be helpful for everyone to learn from your thought process. if you can Please add a code to plot the average output files.
Ameer Hamza
2020-4-4
Please see the updated code. there are four column in your matrix. It will plot each column as a seperate line.
MS
2020-4-4
Thanks for commenting the code . The first two columns of the files are x,y axis and the next two columns are the data. is there a way to mention it in the code and plot it.
MS
2020-4-4
Thanks, plot the figure as mentioned below
first columsn = x axis
second columsn = y axis
third column = u(x,y)
fourth column = v(x,y)
更多回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Workspace Variables and MAT-Files 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!发生错误
由于页面发生更改,无法完成操作。请重新加载页面以查看其更新后的状态。
您也可以从以下列表中选择网站:
如何获得最佳网站性能
选择中国网站(中文或英文)以获得最佳网站性能。其他 MathWorks 国家/地区网站并未针对您所在位置的访问进行优化。
美洲
- América Latina (Español)
- Canada (English)
- United States (English)
欧洲
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)
亚太
- Australia (English)
- India (English)
- New Zealand (English)
- 中国
- 日本Japanese (日本語)
- 한국Korean (한국어)