如何访问工作区中每个结构中的相同字段?

时间:2018-05-09 20:48:25

标签: matlab

我有几个.mat文件的目录。我使用以下代码打开它们。

files = dir('*.mat');
for i=1:length(files)
eval(['load ' files(i).name ]);
end

然后我将所有文件作为我的工作区中的结构。它们都有相同的字段,我想在所有字段中访问一个名为.data的字段。我先尝试用以下方法保存结构的名称:

waveNames = whos

但是我无法使用存储在那里的信息访问对象。 有人能帮助我吗?

由于

1 个答案:

答案 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