我有这样的结构:
Basis.FieldsBasisType.fieldsBasisComponents
每个基础大约有 13 个组件,包括 6 个资产类别 ID。
所以,例如
字段名(Basis.SalaryIncrease)=
'Constant'
'AWeight'
'AAssetClassID'
'ATimeLag'
'BWeight'
'BAssetClassID'
'BTimeLag'
'CWeight'
'CAssetClassID'
'CTimeLag'
'DWeight'
'DAssetClassID'
'DTimeLag'
'EWeight'
'EAssetClassID'
'ETimeLag'
'FWeight'
'FAssetClassID'
'FTimeLag'
'cap'
'floor'
现在我要做的是选择在任何基础上使用的所有独特资产类别。不过,我真的很难做到这一点,目前我正在使用:
basisNames = fieldnames(Basis);
requiredSeries=[];
for i = 1:size(fieldnames(Basis),1)
requiredSeries = [requiredSeries;unique(Basis.(basisNames{i}).AAssetClassID)];
requiredSeries = [requiredSeries;unique(Basis.(basisNames{i}).BAssetClassID)];
requiredSeries = [requiredSeries;unique(Basis.(basisNames{i}).CAssetClassID)];
requiredSeries = [requiredSeries;unique(Basis.(basisNames{i}).DAssetClassID)];
requiredSeries = [requiredSeries;unique(Basis.(basisNames{i}).EAssetClassID)];
requiredSeries = [requiredSeries;unique(Basis.(basisNames{i}).FAssetClassID)];
end
requiredSeries = unique(requiredSeries)
在我看来,这真的很丑陋。我想做某种字符串比较以在字段中找到“AssetClassID”,例如:
field = fieldnames(Basis.(basisNames{1}));
strfind(field,'AssetClassID');
然后使用该单元格数组对“字段”进行逻辑索引,并从“AssetClassID”字段中获取数据。但我坚持做这项工作。
~cellfun('isempty',strfind(field,'AssetClassID'))
获取我的逻辑索引,我如何将其应用于字段,然后使用它来获取值。
任何想法都将不胜感激,我觉得应该有一种简洁的方法,但我错过了一些东西。硬编码这些字段名似乎是一种短视的解决方案。
#编辑:我讨厌自己。
对不起,伙计们,我在发布此消息后想出了一个工作变体,为浪费任何人的时间而道歉!
basisNames = fieldnames(Basis);
for i = 1:size(fieldnames(Basis),1)
field = fieldnames(Basis.(basisNames{i}));
field = cell2mat(field(~cellfun('isempty',strfind(field,'AssetClassID'))));
for j = 1:size(field,1)
requiredSeries = [requiredSeries;unique(Basis.(basisNames{i}).(field(1,:)))];
end
requiredSeries = unique(requiredSeries)
end
我之前错过了一个必要的 cell2mat,导致无法让它流血地工作。无论如何,我总是希望听到对此的改进,否则你可以关闭它。