2015-11-19 16 views
6

Vorrei conoscere il modo più semplice per aggiornare una struttura Matlab da un'altra struttura con campi diversi. Per favore, vedi il mio esempio per capire cosa intendo. Ho due strutture S1 e S2 con nomi di campo diversi che voglio combinare.Strutture concatenate: Aggiorna i campi della struttura senza sovrascrivere i campi esistenti

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

Se scrivo S1 = S2; struttura S1 sarà ovviamente sovrascritta da S2. Voglio che il risultato sia il seguente codice:

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

C'è un modo semplice per farlo. Riesco a farlo utilizzando un ciclo for e la funzione fieldnames() per ottenere il nome di campo da S2 e inserirlo in S1, ma non è una soluzione davvero accurata.

+1

Lo scambio di file Matlab ha una funzione chiamata [ 'catstruct'] (http: //www.mathworks. com/matlabcentral/fileexchange/7842-catstruct) che sembra svolgere il compito richiesto. Forse fornirà suggerimenti o anche una soluzione completa. – mikkola

+0

Non penso che usare un ciclo for qui non sia abbastanza buono. Altre possibilità sono usare 'struct2cell' se hai una sorta di struttura nei nomi dei campi e puoi generarli a livello di codice. – rst

+0

cosa intendi con "soluzione non propriamente pulita"? Perché esattamente non è una buona soluzione? –

risposta

2

Questo potrebbe aiutare se si conoscono i due struct non hanno gli stessi campi

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

3

Dubito che ci sia un vero modo vettoriale. Se hai davvero bisogno di quell'ultimo piccolo bit di velocità, non usare le strutture.

ecco la soluzione ciclo:

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

Il motivo per cui non esiste una soluzione banale, è che Matlab non può sapere in anticipo che non v'è nessun campo c o d in S1, e in caso affermativo, ci sarebbe un conflitto.


Jolo's answer sembra essere vettorializzare, anche se non so come queste funzioni lavorano internamente. E probabilmente non sono molto più veloci del semplice ciclo.

Problemi correlati