2013-03-06 2 views
8

Мне интересно, есть ли удобный способ для обновить структуру со значениями другой структуры в Matlab. Вот код, с использованием fieldnames, numelfor и петли,Обновление структуры через другую структуру в Matlab

fn = fieldnames(new_values); 
for fi=1:numel(fn) 
    old_struct.(fn{fi}) = new_values.(fn{fi}); 
end 

Конечно, я не хочу потерять поля в old_struct, которые не в new_values, так что я не могу используйте простой old_struct=new_values.

Обновление структуры - это то, что мы можем сделать в одной короткой строке в интерпретаторе.

+4

http://blogs.mathworks.com/loren/2009/10/15/concatenating-structs/ – Dan

+0

Ответы на тезисы либо не актуальны (при отсутствии столкновения), либо используют один и тот же метод 'for' loop +' fieldnames' , Это, как правило, подтверждает тот факт, что нет более простого способа, но не дает четких доказательств;) – M1L0U

ответ

5

Поскольку вы убеждены в том, что не существует простой способ добиться того, что вы хотите, вот метод, описанный в Loren Shure's article (ссылка размещена в комментарии Дэна), примененная к вашему примеру:

%// Remove overlapping fields from first struct 
s_merged = rmfield(s_old, intersect(fieldnames(s_old), fieldnames(s_new))); 

%// Obtain all unique names of remaining fields 
names = [fieldnames(s_merged); fieldnames(s_new)]; 

%// Merge both structs 
s_merged = cell2struct([struct2cell(s_merged); struct2cell(s_new)], names, 1); 

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

+0

Будет ли это работать, если одно из полей также является структурой? – Leo

+1

@Leo Я так считаю, но лучший подход в этом случае - попробовать и посмотреть! :-) –

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