1

たとえば、いくつかのレイヤーを持つ構造体としてデータがあります。
data.A.B
アクセスしたいデータはレイヤーにありBます。しかし問題は、データの取得元によってフィールド名Bが異なる可能性があることです。したがって、次のように入力することはできません
data.A.B.myData
myDatastruct

名前を見つけるために: を使用できます
fieldnames(data.A)
が、これはあまり役に立ちません。このレベルで発生する可能性のあるすべてのフィールド名のコード セクションを作成する必要があります。そして、それは私が避けようとしているものです。

myDataのフィールド名を知らなくても、私が持っている ( ) データにたどり着く方法はありBますか?

4

2 に答える 2

1

構造体の各レベルでフィールド名をチェックする再帰関数が必要なだけです。これは大まかに必要なものです (見つかったフィールドへのパスを提供するように改善できます)。

function [ value, found ] = FindField( rootStruct, fieldName )
%FindField - Find a field with a structure
    value = [];
    found = 0;
    if isstruct( rootStruct )
        fields = fieldnames(rootStruct);
        for fi=1:length(fields)
            if strcmp(fields{fi}, fieldName )
                value = rootStruct.(fieldName);
                found = true;
                return;
            end
            [value, found ] = FindField( rootStruct.(fields{fi}), fieldName );
            if found
                return;
            end
        end
    end

end

使用例:

a.b = 1;
a.b.c = 2;
a.b.d = struct('Index',1,'Special',2);
FindField(a,'d')


ans = 

      Index: 1
    Special: 2
于 2013-11-15T03:27:19.663 に答える
1

伝統的に、構造体の特定の部分構造で をループしfieldnamesて検索を実行できます。myDataただし、検索する必要がある部分構造がわからない場合は、再帰アルゴリズムを実行できます。以下は例です。構造体での最初の一致を返すmyDataか、一致が見つからない場合は空の行列を返します。のすべての一致を見つけるようにコードを改善できますmyData

function S2=getmyfield(S1,queriedField)

if isstruct(S1)
    % Get all fieldnames of S1
    fieldArray=fieldnames(S1);

    % Find any match with the queried field. You can also use isfield().
    % If there is a match return the value of S1.(queriedField),
    % else perform a loop and recurse this function.
    matchTF=strcmp(queriedField,fieldArray);
    if any(matchTF)
        S2=S1.(fieldArray{matchTF});
        return;
    else
        S2=[];
        i=0; % an iterator count
        while isempty(S2)
            i=i+1;
            S2=getmyfield(S1.(fieldArray{i}),queriedField);
        end
    end
else
    S2=[];
end

end

乾杯。

于 2013-11-15T03:29:27.960 に答える