0

15 個のフィールドを持つ 1x1 の Matlab 構造体があります

results = 

     RAR_no_compartments_2_0: [1x1 struct]
     RAR_no_compartments_2_1: [1x1 struct]
    RAR_no_compartments_2_10: [1x1 struct]
    RAR_no_compartments_2_11: [1x1 struct]
    RAR_no_compartments_2_12: [1x1 struct]
    RAR_no_compartments_2_13: [1x1 struct]
    RAR_no_compartments_2_14: [1x1 struct]
     RAR_no_compartments_2_2: [1x1 struct]
     RAR_no_compartments_2_3: [1x1 struct]
     RAR_no_compartments_2_4: [1x1 struct]
     RAR_no_compartments_2_5: [1x1 struct]
     RAR_no_compartments_2_6: [1x1 struct]
     RAR_no_compartments_2_7: [1x1 struct]
     RAR_no_compartments_2_8: [1x1 struct]
     RAR_no_compartments_2_9: [1x1 struct]

私はforループでこれらのそれぞれを循環しようとしています:

model_names=fieldnames(results); %get the names of each sub-struct
fieldname_dims=size(fieldnames(results)); %get dimensions of each struct
for i=1:fieldname_dims(1), %iterate over number of substructs
    name=model_names(i) %get the model name
    results.(name) %access the substruct
end

ただし、Matlab は次のエラーを返します。

Argument to dynamic structure reference must evaluate to a valid field name.

これが無効なフィールド名である理由を誰か説明してもらえますか?

4

2 に答える 2

3

これはまさにそのstructfunために作られています。構造体のすべてのフィールドをループできます。

a = struct('a', 1, 'b', 2, 'c', 3);
structfun(@(x)disp(x), a)

1
2
3

または、フィールドに数値が含まれている構造体ではなく、構造体の配列を格納することを検討することもできます。順序を知るためにフィールド名に依存している場合はいつでも、別のデータ構造を使用する方がよい場合があります。

あなたのデータでは、あなたのフィールド名を持つのではなく、RAR_no_compartments_2_0インデックスによってそのフィールドに割り当てられた構造体を割り当てるだけです

RAR_no_compartments(1) = results.RAR_no_compartments_2_0;
RAR_no_compartments(2) = results.RAR_no_compartments_2_1;
...

この方法では、15 個のフィールドを持つ 1 x 1 構造体ではなく、MATLAB 内でネイティブに処理するのがはるかに簡単な構造体の 1 x 15 配列が得られます。

ちょっとした考え。

于 2016-01-15T13:54:17.583 に答える
2

問題はfieldnamesセル配列を返すため、セルの内容にアクセスするには中かっこを使用する必要があることです。これはうまくいくはずです:

model_names=fieldnames(results);
fieldname_dims=size(fieldnames(results),1);
for i=1:fieldname_dims
    name=model_names{i};
    results.(name)
end

カウンターと一時変数を使用する代わりに、セル配列を実際に反復処理することで、全体を簡素化できます。

for name = fieldnames(results).'
    results.(name{:})  % do whatever with your field
end

ただし、構造体のすべてのフィールドにアクセスする正しい方法は、structfunSueverの回答を参照してください。

于 2016-01-15T13:38:45.600 に答える