Hay una cosa que no me gusta en Matlab: a veces intenta ser demasiado inteligente. Por ejemplo, si tengo una raíz cuadrada negativa comoDesactivar el "comportamiento inteligente" en Matlab
a = -1; sqrt(a)
Matlab no generará un error pero cambia en silencio a los números complejos. Lo mismo sucede con los logaritmos negativos. Esto puede llevar a errores difíciles de encontrar en un algoritmo más complicado.
Un problema similar es que Matlab "resuelve" sistemas lineales en silencio no cuadráticas como en el siguiente ejemplo:
A=eye(3,2); b=ones(3,1); x = A \ b
Obviamente x
no satisface A*x==b
(Se resuelve un problema de mínimos cuadrados en lugar).
¿Hay alguna posibilidad de desactivar esas "funciones", o al menos dejar que Matlab imprima un mensaje de advertencia en estos casos? Eso realmente ayuda mucho en muchas situaciones.
Me pregunto por qué las personas rechazaron esta pregunta. Creo que es totalmente legítimo preguntar esto. Además, estoy seguro de que hay muchas personas que perdieron el tiempo buscando errores sutiles debido al comportamiento descrito. – Boris
La forma en que lee su pregunta puede sonar a algunos como "Realmente no leí la documentación que afirma que Matlab admite números complejos, y eso explica lo que hace el operador de barra invertida. ¿Puedo hacer que Matlab haga lo que falsamente asumí que haría, porque realmente estoy frustrado por mi incapacidad para leer la documentación? ". Aunque estoy en desacuerdo con usted sobre el problema con el operador de barra invertida, estoy de acuerdo en que los números complejos pueden ser indicativos de un problema. Por lo tanto, sería bueno si hubiera un "dbstop if complex" además de "dbstop if nan/inf" en el depurador. – Jonas
@Jonas He intentado formular la pregunta de tal manera que el lector no tenga esta impresión, parece que he fallado :(. Tiene razón, la documentación es perfectamente clara al respecto. Creo que Matlab "sobreutiliza" el operador que podría conducir a errores y eso es malo.Otro que los principiantes suelen cometer incorrectamente es el siguiente: Una función (definida incorrectamente) como 'f = @ (x) x * ((x + 1)/x)' da el resultado 'f ([1,2]) = [1.6,3.2] 'mientras que la mayoría de los principiantes esperarían el resultado' [2,3] '. En un programa más grande, tales errores son muy difíciles de encontrar. – Boris