2015-11-19 10 views
6

Chciałbym poznać najłatwiejszy sposób aktualizacji struktury Matlab z innej struktury o różnych polach. Zobacz mój przykład, aby zrozumieć, co mam na myśli. Mam dwie struktury S1 i S2 z różnymi nazwami pól, które chcę połączyć.Połączone struktury: Zaktualizuj pola struct bez nadpisywania istniejących pól

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

Jeśli piszę S1 = S2; struktura S1 będzie oczywiście być nadpisane przez S2. Chcę, aby wynik był następujący:

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

Czy istnieje prosty sposób na zrobienie tego. Udaje mi się to zrobić za pomocą pętli for i funkcji fieldnames(), aby uzyskać nazwę pola od S2 i umieścić ją w S1, ale nie jest to naprawdę zgrabne rozwiązanie.

+1

Wymiana plików Matlab posiada funkcję o nazwie [ 'catstruct'] (http: //www.mathworks. com/matlabcentral/fileexchange/7842-catstruct), który wydaje się wykonywać wymagane zadanie. Być może dostarczy wskazówek, a nawet kompletne rozwiązanie. – mikkola

+0

Nie sądzę, że użycie pętli for nie jest wystarczająco dobre. Inne możliwości to użycie 'struct2cell', jeśli posiadasz jakąś strukturę w nazwach pól i możesz je programowo wygenerować. – rst

+0

co masz na myśli mówiąc "niezbyt porządne rozwiązanie"? Dlaczego właściwie nie jest to dobre rozwiązanie? –

Odpowiedz

2

To może pomóc, jeśli wiesz, dwa kodowanym nie mają takie same pola

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

3

Wątpię, czy istnieje realny sposób wektoryzacji. Jeśli naprawdę potrzebujesz tego ostatniego małego kawałka prędkości, nie używaj struktur.

Oto rozwiązanie pętla:

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

Powodem nie jest trywialne rozwiązanie, jest to, że Matlab nie można z góry wiedzieć, że nie ma pola c lub d w S1, a jeśli tak, byłby konflikt.


Jolo's answer wydaje się być wektorowy, choć nie wiem, jak te funkcje działają wewnętrznie. I prawdopodobnie nie są one dużo szybsze niż prosta pętla.

Powiązane problemy