質問

いを組み合わせ構造の異なる分野の名をとります。

例えば、:

A.field1 = 1;
A.field2 = 'a';

B.field3 = 2;
B.field4 = 'b';

したいと思ってい:

C.field1 = 1;
C.field2 = 'a';
C.field3 = 2;
C.field4 = 'b';

がより効率的な方法を使"フィールド名"、ループ?

編集: その場合はフィールド名の紛争を優先す A.

役に立ちましたか?

解決

無衝突き

M = [fieldnames(A)' fieldnames(B)'; struct2cell(A)' struct2cell(B)'];
C=struct(M{:});

これは合理的に効率的です。しかし、 struct エラーの重複フィールド名は、事前に確認している unique 枯性能のループが優れています。ここでは、そのようになる:

M = [fieldnames(A)' fieldnames(B)'; struct2cell(A)' struct2cell(B)'];

[tmp, rows] = unique(M(1,:), 'last');
M=M(:, rows);

C=struct(M{:});

ることができるかもしれませるハイブリッドソリューションを想定しない紛争をtry/catchを呼び出 struct 優雅に劣化する紛争の取り扱います。

他のヒント

答え: setstructfields (ただし、次の信号処理ツールボックス).


の溶液を投稿したLoren側に 彼女のMathWorksのブログ, 示する SCFrenchこちらEitan T答えは、異なる質問.しかし、ただし、次の信号処理ツールボックス、非正規滞在の機能は、この既に- setstructfields.

help setstructfields

 setstructfields Set fields of a structure using another structure
    setstructfields(STRUCTIN, NEWFIELDS) Set fields of STRUCTIN using
    another structure NEWFIELDS fields.  If fields exist in STRUCTIN
    but not in NEWFIELDS, they will not be changed.

内部的に使用す fieldnamesfor ループではの便利機能データ抽出処理がエラーの確認と再帰のための分野において自らが構造体.

"のオリジナルの"struct:

% struct with fields 'color' and 'count'
s = struct('color','orange','count',2)

s = 
    color: 'orange'
    count: 2

第二の構造体を含む新しい値 'count', 新たな分野 'shape':

% struct with fields 'count' and 'shape'
s2 = struct('count',4,'shape','round')

s2 = 
    count: 4
    shape: 'round'

呼び出し setstructfields:

>> s = setstructfields(s,s2)
s = 
    color: 'orange'
    count: 4
    shape: 'round'

分野 'count'更新.分野 'shape'追加.分野 'color' 変更はない.

注意:以来、その機能は非正規滞在で変更又は削除されます。

私はログイン ションファイル交換catstruct.

ネイティブスピーカーではな性能でも置き換えることができましたようでした。への対応を可能にしています。複製分野のコースです。

ここではどのような著作物:

a.f1 = 1;
a.f2 = 2;
b.f2 = 3;
b.f4 = 4;

s = catstruct(a,b)

s = 

    f1: 1
    f2: 3
    f3: 4

とは思わないを処理することができます紛争のものw/oループもいいと思いますか回避します。もっと効率化が課題ではなく多くの分野で...)

を使用してい機能に書いた数年後という setdefaults.m, を合わせた一つの価値観の構造があり、一つのものの方が優先され他の場合には、紛争の

% SETDEFAULTS sets the default structure values 
%    SOUT = SETDEFAULTS(S, SDEF) reproduces in S 
%    all the structure fields, and their values,  that exist in 
%    SDEF that do not exist in S. 
%    SOUT = SETDEFAULTS(S, SDEF, OVERRIDE) does
%    the same function as above, but if OVERRIDE is 1,
%    it copies all fields of SDEF to SOUT.

function sout = setdefaults(s,sdef,override)
if (not(exist('override','var')))
    override = 0;
end

sout = s;
for f = fieldnames(sdef)'
    cf = char(f);
    if (override | not(isfield(sout,cf)))
        sout = setfield(sout,cf,getfield(sdef,cf));
    end
end

今のことを考えれば、きだと思うのだが、"オーバーライド"の入力は不要でスイッチの順番を入力もん100%確かに---この簡単な書き換え(setdefaults2.m):

% SETDEFAULTS2 sets the default structure values 
%    SOUT = SETDEFAULTS(S, SDEF) reproduces in S 
%    all the structure fields, and their values,  that exist in 
%    SDEF that do not exist in S. 

function sout = setdefaults2(s,sdef)
sout = sdef;
for f = fieldnames(s)'
    sout = setfield(sout,f{1},getfield(s,f{1}));
end

一部の試料を試験す:

>> S1 = struct('a',1,'b',2,'c',3);
>> S2 = struct('b',4,'c',5,'d',6);
>> setdefaults2(S1,S2)

ans = 

    b: 2
    c: 3
    d: 6
    a: 1

>> setdefaults2(S2,S1)

ans = 

    a: 1
    b: 4
    c: 5
    d: 6

Cでは、structのをき構造体の一つとしています。はなのと同じことなので聞こうとしているのですが、最後は状況が一構造体を含む、または構造体を含む二つの構造体であるパーツの情報があります。

psuedocode:記憶してない実際の構文です。

A.field1 = 1;
A.field2 = 'a';
A.field3 = struct B;

アクセス:A.field3.field4;

または何かの並べ替えができます。

やきstruct Cは両A、B

C.A = struct A;
C.B = struct B;

アクセスしよう

C.A.field1;
C.A.field2;
C.B.field3;
C.B.field4;

武器agiは、dexで下がらないboxerぐ!

編集:両方のこれらのソリューションを避けるネーミングが衝突した際に

また、こちらでお分かりになったお matlab タグです。規則にしたがって、編集したい質問が含まれます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top