2013-03-06 1 views
8

Mi chiedo se c'è un modo conveniente per aggiornare una struttura con i valori di un'altra struttura in Matlab. Ecco il codice, con l'uso di fieldnames, numel e un ciclo for,aggiornare la struttura tramite un'altra struttura in Matlab

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

Naturalmente, non voglio perdere i campi in old_struct che non sono in new_values, quindi non posso usa il semplice old_struct=new_values.

L'aggiornamento di una struttura è qualcosa che potremmo voler fare in una singola linea in un interprete.

+4

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

+0

Queste risposte non sono rilevanti (presupponendo alcuna collisione) o usano lo stesso metodo 'for' loop +' fieldnames' . Ciò tende a confermare il fatto che non esiste un modo più semplice, ma non fornisce una prova chiara;) – M1L0U

risposta

5

Dal momento che si è convinti che non esiste un modo più semplice per ottenere ciò che si vuole, qui è il metodo descritto in Loren Shure's article (vedi link postato nel commento di Dan), applicato al tuo esempio:

%// 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); 

Si noti che questa versione leggermente migliorata è in grado di gestire matrici di strutture e strutture con nomi di campi sovrapposti (questo è ciò che credo si chiami collisione).

+0

Funzionerebbe ancora se uno dei campi fosse anche una struttura? – Leo

+1

@Leo Credo di sì, ma l'approccio migliore in questo caso è provare e vedere! :-) –