私はあなたがループなしで競合をうまく処理することはできないと思います。 (効率は多くの分野で問題になると思われますが...)
私は数年前に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 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
し、それをテストするためのいくつかのサンプル::ので、ここでは単純に書き換え(setdefaults2.m
)です
>> 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
第1の溶液は、「cell2struct」によって1つのライナーに変換することができた。私はそれのパフォーマンスについてはわかりません。 –