繁体   English   中英

如何动态访问结构字段?

[英]How do I access structure fields dynamically?

我有一个具有许多字段的结构,这些字段是不同长度的向量。 我想按顺序访问循环中的字段。 我试过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

我首先使用结构,因为数组会遇到不同字段长度的问题。 还有更好的选择吗?

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

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

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

我想在这里提出三点:

  • 您在上面的代码中收到错误的原因是因为您正在索引SNames 函数fieldnames返回字符串的单元格数组 ,因此您必须使用内容索引 (即花括号)来访问字符串值。 如果您将代码中的第四行更改为:

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

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

  • 正如MatlabDoug所建议的那样 ,你可以使用动态字段名称来避免使用getfield (在我看来,它产生更清晰的代码)。

  • 亚当建议使用单元阵列而不是结构正好在标记上。 这通常是将一系列不同长度的数组收集到单个变量中的最佳方法。 您的代码最终会看起来像这样:

     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单元阵列。 它们还允许您存储和索引不同长度的向量。

您可以使用冒号表示法来避免索引:

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(S)'上进行转置fieldnames(S)' 。对于每个循环,SName变为1x1单元格数组,因此我们使用内容索引来访问具有SName{1}的第一个且唯一的元素。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM