逻辑索引结构中的字段

时间:2012-04-11 14:58:59

标签: matlab

我有这样的结构:

Basis.FieldsBasisType.fieldsBasisComponents

每个基础有大约13个组件,包括6个资产类别ID。

所以,例如

fieldnames(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,这导致无法让它进行血腥的工作。无论如何,我总是希望听到改进,但你可以关闭它。

1 个答案:

答案 0 :(得分:0)

对不起朋友们,我想出了一个30分钟的工作版本,或者在发布这个版本之后,根据米歇尔的建议将其作为答案弹出来。

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}).(a(1,:)))];
    end
    requiredSeries = unique(requiredSeries)
end

我之前错过了一个必要的cell2mat,这导致无法让它进行血腥的工作。无论如何,我总是希望听到改进,但你完全忽略了这一点:)