-2

我有这样的结构:

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,导致无法让它流血地工作。无论如何,我总是希望听到对此的改进,否则你可以关闭它。

4

1 回答 1

0

抱歉,伙计们,我在 30 分钟或发布此内容后想出了一个可行的变体,根据 Michelle 的建议将其弹出作为答案。

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,导致无法让它流血地工作。无论如何,我总是希望听到对此的改进,但否则你会完全忽略这一点:)

于 2012-04-12T14:03:03.270 回答