我有几个.mat文件的目录。我使用以下代码打开它们。
files = dir('*.mat');
for i=1:length(files)
eval(['load ' files(i).name ]);
end
然后我将所有文件作为我的工作区中的结构。它们都有相同的字段,我想在所有字段中访问一个名为.data的字段。我先尝试用以下方法保存结构的名称:
waveNames = whos
但是我无法使用存储在那里的信息访问对象。 有人能帮助我吗?
由于
答案 0 :(得分:1)
正如@Justin在评论中所建议的,最好的办法是将MAT文件读入单元格数组。
您无需使用eval
,您可以使用load
的功能形式。在MATLAB中总是如此:
func arg
与
相同func('arg')
所以你可以这样做:
files = dir('*.mat');
vars = cell(size(files));
for ii = 1:numel(files)
vars{ii} = load(files(ii).name);
end
现在,每个vars{ii}
都是一个结构,其中字段名称是文件中的变量。使用fieldnames(vars{ii})
获取可用变量列表。
假设每个文件都有一个名为data
的变量,在循环中您可以访问vars{ii}.data
。您可以使用cellfun
对每个data
元素执行相同的操作。
有可能将文件读入结构数组而不是单元数组,但是您需要每个文件包含完全相同的变量集,否则分配不会起作用:
files = dir('*.mat');
vars = struct();
vars(size(files)).data = []; % pre-allocate the vars array
for ii = 1:numel(files)
vars(ii) = load(files(ii).name);
end
现在你有vars(ii).data
,这比单元格数组更容易管理。例如,如果所有data
元素都是相同类型和大小的矩阵,则可以使用cat(3,vars.data)
检索所有元素。
但是,如果你想要做的就是从每个文件中读取data
元素,这将更方便:
files = dir('*.mat');
data = cell(size(files));
for ii = 1:numel(files)
vars = load(files(ii).name,'data');
s{ii} = vars.data;
end
现在每个s{ii}
都是文件编号data
中的ii
变量。
根据以下评论,如果我理解正确,每个文件AD0_1.mat
都包含一个结构AD0_1
,其中包含一个字段data
。这可以理解如下:
files = dir('*.mat');
data = cell(size(files));
for ii = 1:numel(files)
vars = load(files(ii).name,files(ii).name);
s{ii} = vars.(files(ii).name).data;
end