Ich denke nicht, dass Sie Konflikte gut ohne Schleife bewältigen können, noch glaube ich, dass Sie eine vermeiden müssen. (obwohl ich denke, Effizienz könnte ein Problem mit vielen vielen Feldern sein ...)
Ich benutze eine Funktion, die ich vor ein paar Jahren schrieb setdefaults.m
, die eine Struktur mit den Werten einer anderen Struktur kombiniert, wo man Vorrang hat über den anderen im Falle eines Konflikts.
% 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
Jetzt, wo ich darüber nachdenke, bin ich ziemlich sicher, dass die „überschreiben“ Eingabe nicht erforderlich ist (man kann nur die Reihenfolge der Eingänge wechseln), obwohl ich das nicht 100% sicher bin .. ., so ist hier eine einfachere Rewrite (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
und einige Proben zu testen:
>> 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
Die erste Lösung konnte von "cell2struct" in einen einzigen Liner umgewandelt werden. Ich weiß aber nicht, wie das funktioniert. –