Matlab 如何动态访问结构字段?

Matlab 如何动态访问结构字段?,matlab,matlab-struct,Matlab,Matlab Struct,我有一个结构,有许多字段,它们是不同长度的向量。我想按顺序访问循环中的字段。我尝试了如下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 dimen

我有一个结构,有许多字段,它们是不同长度的向量。我想按顺序访问循环中的字段。我尝试了如下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

我首先使用结构,因为数组在不同的字段长度上会有问题。有更好的替代方法吗?

getfield方法还可以(尽管我现在没有MATLAB,也不清楚为什么上面的方法不起作用)


对于另一种数据结构,您可能还需要查看MATLAB单元数组。它们还允许您存储和索引不同长度的向量。

尝试动态字段引用,将字符串放在括号中,如定义内容的行中所示


我同意史蒂夫和亚当的观点。使用细胞。不过,这种语法适用于其他情况下的人

这里我想提出三点:

  • 上述代码中出现错误的原因是,您是如何为SNAME编制索引的。该函数返回一组字符串,因此必须使用(即大括号)来访问字符串值。如果将代码中的第四行更改为:

    field = getfield(S, SNames{loopIndex});
    
    那么您的代码应该可以正常工作

  • 正如所建议的,您可以使用来避免使用(在我看来,这会产生更干净的代码)

  • 使用a而不是结构的方法是正确的。这通常是将一系列不同长度的数组收集到单个变量中的最佳方法。您的代码最终会显示如下内容:

    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
    

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

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
我在结构中生成了一些类似的东西,然后我需要像矩阵一样访问它,在这种情况下,它就像

M = cell2mat(struct2cell(S));

将其转换为矩阵

,只需在混合中添加另一个答案即可。我喜欢@Niver的解决方案,但它只适用于具有单字母名称的字段。我使用的解决方案是:

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

for
将遍历单元格数组的列(因此
fieldnames上的转置)
。对于每个循环SName,它将成为1x1单元格数组,因此我们使用内容索引来访问第一个也是唯一一个具有
SName{1}的元素> 

鉴于您对使用Struts的描述,我同意亚当。您应该考虑使用单元格数组。使用单元格数组而不是StULTE是不太冗长的。M= TabLe2Read(Stult2TABLE(S));注意:这仅仅是因为字段名每个都有一个字母。这通常不起作用。
S = struct('A', [1 2], 'B',[3 4 5], 'Cee', [6 7]); 
for SName = fieldnames(S)'
    stuff = S.(SName{1})
end