如何dynamic访问结构域?

我有一个很多领域的结构是不同长度的向量。 我想按顺序访问一个循环内的字段。 我试图getfield如下,但MATLAB不喜欢。 我该怎么做?

S = struct('A', [1 2], 'B',[3 4 5]); SNames = fieldnames(S); for loopIndex = 1:2 field = getfield(S, SNames(loopIndex)); %do stuff w/ field end ??? Index exceeds matrix dimensions 

我首先使用结构,因为数组在不同的字段长度上会遇到麻烦。 有更好的select吗?

尝试dynamic的字段引用,你可以把一个string放在括号中,就像定义一些东西的行一样。

 S = struct('A', [1 2], 'B',[3 4 5]); SNames = fieldnames(S); for loopIndex = 1:numel(SNames) stuff = S.(SNames{loopIndex}) end 

我同意史蒂夫和亚当。 使用单元格。 这种语法适合于其他情况下的人!

我想在这里提出三点:

  • 你在上面的代码中遇到错误的原因是你如何索引SNames 。 函数fieldnames返回一个string数组 ,所以你必须使用内容索引 (即大括号)来访问string值。 如果您将代码中的第四行更改为:

     field = getfield(S, SNames{loopIndex}); 

    那么你的代码应该没有错误的工作。

  • 正如MatlabDoug所build议的那样 ,您可以使用dynamic字段名称来避免必须使用getfield (在我看来,这会生成更清晰的代码)。

  • 亚当build议使用单元arrays而不是结构是正确的。 这通常是将一系列不同长度的数组收集到一个variables中的最佳方法。 你的代码最终会看起来像这样:

     S = {[1 2], [3 4 5]}; % Create the cell array for loopIndex = 1:numel(S) % Loop over the number of cells array = S{loopIndex}; % Access the contents of each cell % Do stuff with array end 

getfield方法是可以的(虽然我现在没有MATLAB可用,但是我不清楚为什么上述方法不起作用)。

对于另一种数据结构,您可能还需要查看MATLAB单元arrays。 他们还可以让你存储和索引不同长度的向量。

您可以使用冒号记号来避免索引:

 S = struct('A', [1 2], 'B',[3 4 5]); SNames = fieldnames(S); for SName = [SNames{:}] stuff = S.(SName) end 

如果你需要使用一个结构,我发现工作得非常好,先转换成一个单元,那么你就拥有了两全其美的优点。

 S = struct('A', [1 2], 'B',[3 4 5]); S_Cell = struct2cell(S); %Then as per gnovice for loopIndex = 1:numel(S_Sell) % Loop over the number of cells array = S{loopIndex}; % Access the contents of each cell %# Do stuff with array end 

我使用了类似的东西在一个结构中生成的东西,然后我需要像matrix访问它,在这种情况下,它就像

 M = cell2mat(struct2cell(S)); 

将其转换为matrix

只是为了增加另一个答案。 我喜欢@Niver的解决scheme,但它只适用于单字母名称的字段。 我使用的解决scheme是:

 S = struct('A', [1 2], 'B',[3 4 5], 'Cee', [6 7]); for SName = fieldnames(S)' stuff = S.(SName{1}) end 

for循环遍历单元格数组的列(因此fieldnames(S)'上的转置fieldnames(S)' 。对于每个循环,SName变成1×1单元arrays,所以我们使用内容索引来访问SName{1}的第一个和唯一的元素。