2014-11-26 7 views
7

Desidero aggiungere dati a una matrice di strutture senza che i campi delle strutture aggiunte abbiano necessariamente lo stesso ordine come i campi delle strutture originali. Per esempio:Esiste una variante delle strutture Matlab che non impone l'ordine dei campi?

% Works fine: 
students.name = 'John'; 
students.age = 28; 
student2.name = 'Steve'; 
student2.age = 23; 

students(2) = student2; 

% Error if the order of the fields of student2 is reversed 
students.name = 'John'; 
students.age = 28; 
student2.age = 23; 
student2.name = 'Steve'; 


students(2) = student2; % Error: Dissimilar structs 

C'è una variante di struct posso aggiungere dati senza dover mantenere lo stesso ordine dei campi?

MODIFICA: una soluzione consiste nell'utilizzare sempre i "campi dell'ordine" matlabs, che ordinano i campi in ordine alfabetico. Cioè, l'esempio errato di cui sopra diventerebbe:

% Order fields alphabetically 
students.name = 'John'; 
students.age = 28; 
student2.age = 23; 
student2.name = 'Steve'; 
students = orderfields(students); 
student2 = orderfields(student2); 
students(2) = student2; % Works 

Non sono sicuro se questa sia la soluzione più naturale.

+4

probabilmente l'applicazione 'orderfields' ad entrambe le strutture corregge questo. – Daniel

+0

Grazie, ho visto il tuo commento troppo tardi! – jolo

risposta

4

Una soluzione "naturale" sarebbe quella di initiallize (creare) ogni struttura con un ordine fisso di campi. Una volta che la struttura è stata creata in questo modo, puoi riempire i suoi campi in qualsiasi ordine.

Inoltre, è possibile inserire in una funzione. Questo semplifica il codice e assicura che l'ordine è coerente. Nel tuo caso, la funzione di creatore potrebbe essere

create_student = @(x) struct('name',[], 'age',[]); %// empty fields. Fixed order 

Così il vostro codice sarebbe diventato

students = create_student(); %// call struct creator 
students.name = 'John'; 
students.age = 28; 
student2 = create_student(); %// call struct creator 
student2.age = 23; 
student2.name = 'Steve'; 
students(2) = student2; %// Now this works 
2

Sì, esiste un'alternativa, ovvero l'utilizzo delle classi. Vedere la documentazione di classdef per esempio, o più in generale il start page of Matlab's OOP. Si noti che richiede all'utente di scrivere alcuni file di classe prima di utilizzarli, quindi non è così semplice come usare le strutture, ma è molto più flessibile una volta terminato il lavoro di classe.

+0

Grazie - buona idea, ma penso che non sia molto pratico nel mio caso! – jolo

1

Un modo semplice è quello di applicare orderfields prima di assegnare qualsiasi struct, come suggerisce Daniel nei commenti

>> students(1) = orderfields(struct('name', 'John', 'age', 18)); 
>> students(2) = orderfields(struct('age', 20, 'name', 'Jane')); 
Problemi correlati