在MATLAB中遍历结构字段名


74

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

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'

我无法解决这个问题。

Answers:


94

您必须使用花括号({})进行访问fields,因为该fieldnames函数返回一个字符串单元格数组

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

使用括号访问单元格数组中的数据只会返回另一个单元格数组,其显示方式与字符数组不同:

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

2
您的回答非常有帮助,并且已经清除了多年来困扰我的一些事情。
疯狂物理学家

15

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

请注意,除了遍历数字外,还可以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

5

您的fns是一个cellstr数组。您需要使用{}而不是()对其进行索引,以将单个字符串作为char获得。

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

用()对其进行索引将返回一个1字符长的cellstr数组,该数组与动态字段引用“。(name)”想要的char数组的格式不同。格式,特别是在显示输出中,可能会造成混淆。若要查看区别,请尝试此。

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

1

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

>> signal
signal = 
sin: {{1x1x25 cell}  {1x1x25 cell}}
cos: {{1x1x25 cell}  {1x1x25 cell}}

>> each(fieldnames(signal))
ans = 
CellIterator with properties:

NumberOfIterations: 2.0000e+000

用法:

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

我非常喜欢它。当然要感谢开发工具箱的Jeremy Hughes。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.