MATLAB:将结构字段名称的一部分传递给函数

时间:2017-10-20 14:40:45

标签: matlab function struct

我需要将结构名称的一部分传递给函数。

可用结构的示例:

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});

2 个答案:

答案 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}});

然后可以将单元格数组的第一部分作为参数传递给函数。