迭代MATLAB中的struct fieldnames

时间:2010-05-10 15:32:29

标签: matlab matlab-struct

我的问题很容易归纳为:“为什么以下内容不起作用?”

teststruct = struct('a',3,'b',5,'c',9)

fields = fieldnames(teststruct)

for i=1:numel(fields)
  fields(i)
  teststruct.(fields(i))
end

输出:

ans = 'a'

??? Argument to dynamic structure reference must evaluate to a valid field name.

特别是因为teststruct.('a') 工作。 fields(i)打印出ans = 'a'

我无法理解它。

4 个答案:

答案 0 :(得分:88)

您必须使用花括号({})来访问fields,因为fieldnames函数会返回cell array个字符串:

for i = 1:numel(fields)
  teststruct.(fields{i})
end

使用括号access data in your cell array将返回另一个单元格数组,其显示方式与字符数组不同:

>> fields(1)  % Get the first cell of the cell array

ans = 

    'a'       % This is how the 1-element cell array is displayed

>> fields{1}  % Get the contents of the first cell of the cell array

ans =

a             % This is how the single character is displayed

答案 1 :(得分:15)

由于fieldsfns是单元格数组,因此必须使用大括号{}进行索引才能访问单元格的内容,即字符串。

请注意,您可以直接循环遍历fields,而不是循环遍历数字,利用一个简洁的Matlab功能,可以循环遍历任何数组。迭代变量采用数组每列的值。

teststruct = struct('a',3,'b',5,'c',9)

fields = fieldnames(teststruct)

for fn=fields'
  fn
  %# since fn is a 1-by-1 cell array, you still need to index into it, unfortunately
  teststruct.(fn{1})
end

答案 2 :(得分:5)

你的fns是一个celltr数组。您需要使用{}而不是()来索引它,以将单个字符串输出为char。

fns{i}
teststruct.(fns{i})

使用()索引到它会返回一个1长的cellstr数组,该数组与“。(name)”动态字段引用所需的char数组的格式不同。格式化,特别是在显示输出中,可能会造成混淆。要看到差异,请试试这个。

name_as_char = 'a'
name_as_cellstr = {'a'}

答案 3 :(得分:0)

您可以使用http://www.mathworks.com/matlabcentral/fileexchange/48729-for-each中的每个工具箱。

for bridge = each(fieldnames(signal))
   signal.(bridge) = rand(10);
end

用法:

{{1}}

我非常喜欢。当然可以归功于开发工具箱的Jeremy Hughes。