在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
由于fields
或fns
是单元格数组,所以必须使用大括号{}
进行索引才能访问单元格的内容,即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。