この効率的な方法を組み合わせ構造のMATLAB?
質問
いを組み合わせ構造の異なる分野の名をとります。
例えば、:
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.
内部的に使用す fieldnames
や for
ループではの便利機能データ抽出処理がエラーの確認と再帰のための分野において自らが構造体.
例
"のオリジナルの"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
タグです。規則にしたがって、編集したい質問が含まれます。