Следующая функция работает для вашего конкретного примера. Будут вещи, которые он не рассматривает, поэтому дайте мне знать, если есть другие случаи, для которых вы хотите, чтобы он работал, и я могу обновить.
function res = mergeStructs(x,y)
if isstruct(x) && isstruct(y)
res = x;
names = fieldnames(y);
for fnum = 1:numel(names)
if isfield(x,names{fnum})
res.(names{fnum}) = mergeStructs(x.(names{fnum}),y.(names{fnum}));
else
res.(names{fnum}) = y.(names{fnum});
end
end
else
res = y;
end
Тогда res = mergeStructs(x,y);
дает:
>> res.a
ans =
4
>> res.b
ans =
c: 2
d: 3
как вам нужно.
РЕДАКТИРОВАТЬ: я добавил isstruct(x) &&
в первой строке. Старая версия работала нормально, потому что isfield(x,n)
возвращает 0
, если ~isstruct(x)
, но новая версия немного быстрее, если y
является большой структурой и ~isstruct(x)
.