Рекурсивная конкатенация структур Matlab - PullRequest
4 голосов
/ 07 июня 2011

Возможно ли как-то рекурсивно объединить две структуры matlab без итерации по всем листам одной из структур.

Например,

xa = 1;

xbc = 2;

ybd = 3;

ya = 4;

приведет к следующему

res = mergeStructs (x, y)

res.a = 4

res.bc = 2

res.bd = 3

1 Ответ

6 голосов
/ 08 июня 2011

Следующая функция работает для вашего конкретного примера. Будут вещи, которые он не рассматривает, поэтому дайте мне знать, если есть другие случаи, для которых вы хотите, чтобы он работал, и я могу обновить.

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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...