我需要将结构名称的一部分传递给函数。
可用结构的示例:
systems.system1.stats.equityCurve.relative.exFee
systems.system1.stats.equityCurve.relative.inFee
systems.system2.stats.equityCurve.relative.exFee
systems.system2.stats.equityCurve.relative.inFee
systems.system1.returns.aggregated.exFee
systems.system1.returns.aggregated.inFee
systems.system2.returns.aggregated.exFee
systems.system2.returns.aggregated.inFee
... This goes on...
在一个函数中,我按如下方式遍历结构:
function mat = test(fNames)
feeString = {'exFee', 'inFee'};
sysNames = {'system1', 'system2'};
for n = 1 : 2
mat{n} = systems.(sysNames{n}).stats.equityCurve.relative.(feeString{n});
end
end
我喜欢在循环中灵活处理的是中间部分,即systems.(sysNames{n})
之后和.(feeString{n})
之前的部分(比较示例)。
我现在正在寻找一种方法将中间部分作为输入参数fNames
传递给函数。循环应该包含类似
mat{n} = systems.(sysNames{n}).(fName).(feeString{n});
答案 0 :(得分:1)
这是matlab在文档中有点无用的情况之一。有一种方法可以在matlab中使用fieldnames
函数来获取所有字段的列表,并使用动态字段对其进行迭代。
systems.system1.stats.equityCurve.relative.exFee='T'
systems.system1.stats.equityCurve.relative.inFee='E'
systems.system2.stats.equityCurve.relative.exFee='S'
systems.system2.stats.equityCurve.relative.inFee='T'
systems.system1.returns.aggregated.exFee='D'
systems.system1.returns.aggregated.inFee='A'
systems.system2.returns.aggregated.exFee='T'
systems.system2.returns.aggregated.inFee='A'
dynamicvariable=fieldnames(systems.system1)
这将返回可用于迭代的字段名称的单元格矩阵。
systems.system1.(dynamicvariable{1})
ans =
equityCurve: [1x1 struct]
理想情况下,您可以修改数据结构,以便了解数据结构中有多少深度级别。
答案 1 :(得分:1)
如何使用辅助函数,如
function rec_stru = recSA(stru, field_names)
if numel(field_names) == 1
rec_stru = stru.(field_names{1});
else
rec_stru = recSA(stru.(field_names{1}), field_names(2:end));
end
此函数将中间字段名称作为单元格数组。 这将转变这一说法:
mat{n} = systems.(sysNames{n}).stats.equityCurve.relative.(feeString{n});
到
mat{n} = recSA(systems.(sysNames{n}), {'stats', 'equityCurve', 'relative', feeString{n}});
然后可以将单元格数组的第一部分作为参数传递给函数。