我想在我的工作区中加载多个.mat文件(大约500个)。 这些文件命名为
omni_AP1_trial_1_loc_1.mat
omni_AP1_trial_1_loc_2.mat
omni_AP1_trial_1_loc_3.mat
.
.
omni_AP1_trial_1_loc_57.mat
.
.
omni_AP1_trial_10_loc_1.mat
omni_AP1_trial_10_loc_2.mat
omni_AP1_trial_10_loc_3.mat
.
.
omni_AP1_trial_10_loc_57.mat
我正在使用给定的代码:
files_1 = dir('omni_AP1_trial_*_loc_1.mat');
NumberOfDataset = length(files_1);
for i = 1:NumberOfDataset
%get allfiles matching the pattern 'dataset(i)_*'
files = dir(sprintf('omni_AP1_trial_%d_loc_*.mat',i));
for j = 1:length(files)
fprintf('Current file : %s\n',files(j).name)
a= load(files(j).name);
end
end
在执行期间,即使fprintf语句显示正在拾取的连续文件,但结构仅保留最后一个拾取的文件,并且在循环迭代时覆盖前一个文件。
如何在工作区中将所有文件一起加载?请帮忙。
答案 0 :(得分:3)
您可以在迭代中为结果创建一个结构数组:
a = []; % create empty array
files_1 = dir('omni_AP1_trial_*_loc_1.mat');
NumberOfDataset = length(files_1);
for i = 1:NumberOfDataset
%get allfiles matching the pattern 'dataset(i)_*'
files = dir(sprintf('omni_AP1_trial_%d_loc_*.mat',i));
for j = 1:length(files)
fprintf('Current file : %s\n',files(j).name)
a(end+1)= load(files(j).name); % store data in struct array
end
end
答案 1 :(得分:2)
每次都会覆盖您的a
值,但您可以拥有一系列结构:
a(j) = load(files(j).name);
下一个问题通常是如何在多个struct数组元素中索引相同的子元素。如果subelement
是存储在文件中的变量的标量字段(如果该变量在每个文件中具有相同的名称),则可以执行
[a(:).variablename.subelement]
答案 2 :(得分:0)
为了简单起见,我尝试使用
for jj=1:57
for ii = 1: 10
a(ii,jj) =load(['omni_AP1_trial_' num2str(ii) '_loc_' num2str(jj)'.mat']);
end
end
我总共有57个位置被提及为loc_1到loc_1,每个位置我正在进行10次试验,这些位置就像trial_1_loc_1,trial_2_loc_1到trial_10_loc_1。
在上面的代码中,当我不使用第一个循环(即jj)和我将num2str(jj)替换为1(即location_1)时,那么在那种情况下我将获得10个位置1的试验。当我将其更改为2时,我将对位置2进行10次试验,依此类推。
因此,当我只使用一个循环时,它起作用,代码是:
for ii = 1: 10
a(ii) =load(['omni_AP1_trial_' num2str(ii) '_loc_1.mat']);
end
上面的代码工作正常。所以现在我想用2个循环一个用于位置(jj循环),另一个用于试验次数(ii循环)。我想以这样的方式使用循环:对于我的第一个位置,它将加载10个试验,然后它将加载另外10个试验,依此类推。当我使用这两个循环时,我收到一个错误(意外的matlab运算符)。不知道出了什么问题。我不确定我使用的逻辑是否正确。如果逻辑是正确的,那么当我使用2个循环加载所有文件时,上面的代码有什么问题?