在MATLAB中迭代struct fieldnames

我的问题很容易概括为: “为什么以下不行?”

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'

我无法理解它。

您必须使用大括号( {} )来访问fields ,因为FIELDNAMES函数返回string的单元数组:

 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 

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

请注意,不是循环遍历一个数字,您也可以直接循环fields ,利用一个简洁的Matlabfunction,让您循环任何数组。 迭代variables采用数组中每列的值。

 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 

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

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

使用()索引它将返回一个长度为1的cellstr数组,它与“。(name)”dynamic字段引用所需的char数组格式不同。 格式化,特别是在显示输出中,可能会令人困惑。 要看到差异,试试这个。

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

您可以使用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。