-2

私は次のような構造を持っています:

Basis.FieldsBasisType.fieldsBasisComponents

各基準には、6 つの資産クラス ID を含む最大 13 のコンポーネントがあります。

たとえば、

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 が不足していたため、血まみれの作業を行うことができませんでした。とにかく、私は常にそれに対する改善を聞きたいと思っていますが、それ以外の場合はこれをシャットダウンできます.

4

1 に答える 1

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 が不足していたため、血まみれの作業を行うことができませんでした。とにかく、私は常にそれに対する改善を聞きたいと思っていますが、そうでなければあなたはこれを完全に無視します:)

于 2012-04-12T14:03:03.270 に答える