2012-03-31 28 views

Respuesta

19

Utilice la función isequal o isequalwithequalnans. Código de ejemplo:

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: Si las estructuras contienen 'NaN',' isequal' puede devolver 'false' aunque consideremos que las estructuras son similares. Por lo tanto, sugiero usar 'isequalwithequalnans' en lugar de' isequal'. – Jonas

+0

@Jonas Ese es un buen punto. He editado la respuesta. – Pursuit

+3

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

2

me acaba de escribir una función isStructEqual(struct1,struct2) que realiza comparaciones periódicas sobre todos los atributos miembros. Si alguna de esas comparaciones arroja 'falso' o '0', salga inmediatamente y devuelva 'falso'; de lo contrario, si llega a la lista de atributos de miembro sin que eso ocurra, devuelva true. Si la estructura es extremadamente grande, existen formas de automatizar el proceso de iteración en los campos de miembros.

En cuanto al intercambio de archivos central, puede probar this file.

+0

¿Hay alguna razón para que esto no se implemente como parte del idioma o la biblioteca estándar? Parecería una funcionalidad bastante básica. –

+0

Probablemente solo porque no desean admitir una comparación complicada para varias variables de estructura. No estoy seguro de qué puede ser un atributo de miembro, pero qué pasa si cosas como variables simbólicas o objetos específicos de caja de herramientas se agregan como campos de estructura. Si alguien más no tiene la caja de herramientas correcta, podría causar problemas, y eso podría ser un dolor de cabeza de baja prioridad para la gente de Mathworks. No soy un gran admirador de Mathworks por cosas como esas. Si tiene la opción de trabajar en otro idioma y desea hacerlo, considere Python con NumPy. – ely

+1

Octave obligatorio por supuesto, lamentablemente. Si me saliera con la mía, usaría C++, stl, quizás boost y una biblioteca matemática de ciencia ficción como Armadillo: http://arma.sourceforge.net/ –

Cuestiones relacionadas