2015-11-19 19 views
6

異なるフィールドを持つ別の構造体からMatlab構造体を更新する最も簡単な方法を知りたいと思います。私の言いたいことを理解するために私の例を見てください。私は、組み合わせたい異なるフィールド名を持つ2つの構造S1とS2を持っています。私はS1 = S2;を書く場合構造体を連結する:既存のフィールドを上書きせずに構造体フィールドを更新する

S1.a = 1; 
S1.b = 2; 
S2.c = 3; 
S2.d = 4; 

S1構造が明らかにS2によって上書きされます。結果を次のコードにします:

S1.a = 1; 
S1.b = 2; 
S1.c = 3; 
S1.d = 4; 

これは簡単な方法ですか?私はS2からfieldnameを取得し、それをS1に入れるためにforループとfieldnames()関数を使用することでそれを行うことができますが、それは本当に素敵な解決策ではありません。

+1

Matlabのファイル交換を持っていない知っている場合、これは役立つかもしれないが、呼び出された関数[ 'catstruct'](HTTPを持っています。 com/matlabcentral/fileexchange/7842-catstruct)が必要な作業を行っているようです。多分それはヒントや完全な解決策を提供するでしょう。 – mikkola

+0

私はここでforループを使用すると十分ではないと思います。フィールド名に何らかの構造体があり、それをプログラムで生成できる場合は、 'struct2cell'を使用することもできます。 – rst

+0

「本当に素敵な解決策ではない」とはどういう意味ですか?なぜそれは良い解決策ではないのですか? –

答えて

2

次の2つの構造体は、同じフィールド

tmp = [fieldnames(S1), struct2cell(S1); fieldnames(S2), struct2cell(S2)].'; S1 = struct(tmp{:});

3

実際のベクター化された方法があるのでしょうか。あなたが本当に最後の小さなビットを必要とするなら、構造体を使わないでください。ここで

がループソリューションです:

fn = fieldnames(S2) 
for ii = 1:numel(fn), S1.(fn{ii}) = S2.(fn{ii}); end 

は全く自明な解が存在しない理由、MATLABは何のフィールドcまたはdS1に存在しないことを事前に知っている、そうであればできないことです、紛争が起こるだろう。


Jolo's answer私は、これらの機能は、内部でどのように動作するかわかりませんけれども、ベクトル化しているようです。そして、おそらく単純なループよりもはるかに高速ではありません。 //www.mathworks:

関連する問題