2015-11-19 5 views
6

Я хотел бы знать, как проще всего обновить структуру Matlab из другой структуры с разными полями. Пожалуйста, посмотрите мой пример, чтобы понять, что я имею в виду. У меня две структуры S1 и S2 с разными именами полей, которые я хочу объединить.Структуры конкатенации: обновить поля структуры без перезаписывания существующих полей

S1.a = 1; 
S1.b = 2; 
S2.c = 3; 
S2.d = 4; 

Если я пишу S1 = S2; структура S1, очевидно, будет перезаписана S2. Я хочу, чтобы результат был следующим кодом:

S1.a = 1; 
S1.b = 2; 
S1.c = 3; 
S1.d = 4; 

Есть ли простой способ сделать это. Мне удается это сделать, используя цикл for и функцию fieldnames(), чтобы получить имя поля из S2 и поместить его в S1, но это не совсем опрятное решение.

+1

Matlab файл обмена есть функция [ 'catstruct'] (HTTP: //www.mathworks. com/matlabcentral/fileexchange/7842-catstruct), который, похоже, выполняет требуемую задачу. Возможно, это даст подсказки или даже полное решение. – mikkola

+0

Я не думаю, что использование цикла for здесь недостаточно. Другие возможности - использовать 'struct2cell', если у вас есть какая-то структура в ваших именах полей и может сгенерировать их программно. – rst

+0

Что вы подразумеваете под «не совсем опрятным решением»? Почему именно это не является хорошим решением? –

ответ

2

Это может помочь, если вы знаете, что два не Структуры имеют одинаковые поля

tmp = [fieldnames(S1), struct2cell(S1); fieldnames(S2), struct2cell(S2)].'; S1 = struct(tmp{:});

3

Я сомневаюсь, что существует реальный векторизованный способ. Если вам действительно нужна эта небольшая небольшая скорость, не используйте структуры.

Вот решение петли:

fn = fieldnames(S2) 
for ii = 1:numel(fn), S1.(fn{ii}) = S2.(fn{ii}); end 

Причина, почему нет тривиального решения, что Matlab не может знать заранее, что там нет поля c или d в S1, и если да, то будет конфликт.


Jolo's answer, кажется, векторизация, хотя я не знаю, как эти функции работают внутри. И они, вероятно, не намного быстрее, чем простой цикл.

Смежные вопросы