Tôi không nghĩ rằng bạn có thể xử lý xung đột tốt với vòng lặp, cũng như tôi nghĩ bạn không cần phải tránh. (mặc dù tôi cho rằng hiệu quả có thể là vấn đề w/nhiều trường ...)
Tôi sử dụng hàm tôi đã viết vài năm trở lại có tên là setdefaults.m
, kết hợp một cấu trúc với các giá trị của cấu trúc khác. qua trường hợp khác trong trường hợp xung đột.
% 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
Bây giờ tôi nghĩ về nó, tôi khá chắc chắn rằng "ghi đè" đầu vào là không cần thiết (bạn chỉ có thể chuyển đổi thứ tự của các yếu tố đầu) mặc dù tôi không phải là 100% chắc chắn về điều đó .. . vì vậy đây là một viết lại đơn giản hơn (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
và một số mẫu để kiểm tra nó:
>> 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
Giải pháp đầu tiên có thể được chuyển thành một lớp lót bằng 'cell2struct'. Tôi không biết về hiệu suất của nó mặc dù. –