2012-03-31 27 views

risposta

19

Utilizzare la funzione isequal o isequalwithequalnans. Codice di esempio:

s1.field1 = [1 2 3]; 
s1.field2 = {2,3,4,{5,6}}; 
s2 = s1; 
isequal(s1,s2) %Returns true (structures match) 

s1.field3 = [1 2 nan]; 
s2.field3 = [1 2 nan]; 
isequal(s1, s2)    %Returns false (NaN ~= NaN) 
isequalwithequalnans(s1, s2) %Returns true (NaN == NaN) 

s2.field2{end+1}=7; 
isequal(s1,s2)    %Returns false (different structures) 

isequal(s1, 'Some string') %Returns false (different classes) 
+5

@ user1131467: Se le strutture contengono 'NaN',' isequal' può restituire 'false' anche se consideriamo le strutture simili. Quindi, suggerisco di usare 'isequalwithequalnans' invece di' isequal'. – Jonas

+0

@Jonas Questo è un buon punto. Ho modificato la risposta. – Pursuit

+3

In R2012b usare ['isequaln'] (http://www.mathworks.com/help/matlab/ref/isequaln.html). –

2

vorrei solo scrivere una funzione isStructEqual(struct1,struct2) che esegue confronti regolari su tutti gli attributi membri. Se un confronto di questo tipo restituisce "falso" o "0", immediatamente si esce e si restituisce "falso", altrimenti se si effettua tutto l'elenco degli attributi dei membri senza che ciò accada, restituire true. Se la struttura è estremamente grande, esistono modi per automatizzare il processo di iterazione sui campi membri.

Guardando allo scambio di file centrale, si potrebbe provare this file.

+0

C'è qualche ragione che questo non sia implementato come parte della lingua o della libreria standard? Sembrerebbe una funzionalità abbastanza basilare. –

+0

Probabilmente solo perché non vogliono supportare un confronto complicato per varie variabili struct. Non sono sicuro di cosa possa essere un attributo membro, ma cosa succede se cose come variabili simboliche o oggetti specifici per toolbox vengono aggiunti come campi struct. Se qualcun altro non ha la giusta casella degli strumenti, potrebbe causare problemi e potrebbe essere solo un mal di testa a bassa priorità per gli utenti di Mathworks. Non sono un grande fan di Mathworks a causa di cose del genere. Se hai la possibilità di lavorare in un'altra lingua e vuoi, prendi in considerazione Python con NumPy. – ely

+1

Purtroppo l'ottava è obbligatoria. Se avessi la mia strada, userei C++, stl, forse boost e una libreria di matematica come Armadillo: http://arma.sourceforge.net/ –

Problemi correlati