He estado usando
MATLAB por más de 25 años. (Y antes de eso, incluso usé
MATRIXx , no
podía descansar en paz). Este
no es
el primer idioma en el que aprendí a programar , pero este es el idioma con el que llegué a la edad matemática. Saber MATLAB ha sido gratificante para mi carrera.
Sin embargo, es imposible ignorar el crecimiento de Python en informática científica. MathWorks debería sentir lo mismo: no solo agregaron la capacidad de
llamar a Python directamente desde MATLAB , sino que también tomaron prestadas algunas de sus características de lenguaje, como un
pase más agresivo para los componentes del operador binario.
Llegó el momento en que cuestioné mi uso continuo de MATLAB tanto en investigación como en enseñanza. Sin embargo, invertí tanto en los materiales que fue difícil encontrar la motivación para aprender algo nuevo.

Este artículo fue traducido con el apoyo del software EDISON, que se ocupa de la salud de los programadores y su desayuno , y también desarrolla software personalizado .
Tutorial introductorio de MATLAB, que coescribí para matemáticas computacionales. El libro contiene más de 40 funciones y 160 ejemplos computacionales, y cubre lo que, creo, es fundamental en el uso de MATLAB para cálculos científicos numéricos. En parte para la superación personal, y en parte para aumentar la utilidad del libro este año, decidí traducir el código a
Julia y
Python . Esta experiencia me llevó a puntos de vista especiales en tres idiomas con respecto a la informática científica, que estoy tratando de describir a continuación.
Pospondré cuestiones de costo y apertura. MATLAB, a diferencia de Python y Julia, no es un producto gratuito. Esta es una gran diferencia, para algunos, pero quiero considerar los méritos técnicos. Durante muchos años, MATLAB fue mucho más allá de cualquier producto gratuito de varias maneras muy útiles, y si desea ser productivo, el costo será infernal. Esta es una discusión separada del atractivo platónico del lenguaje y el ecosistema.
Si omitimos problemas relacionados con los costos, la razón de las muchas diferencias en estos idiomas está relacionada con su origen. MATLAB primero priorizó el aspecto matemático, a saber, las matemáticas computacionales. Python, que apareció en la década de 1980, puso a la informática a la vanguardia. Establecida en 2009, Julia se ha fijado el objetivo de lograr un equilibrio entre los dos idiomas anteriores.
MATLAB
Inicialmente, cada valor en MATLAB era una matriz de números de coma flotante de doble precisión. Ambos aspectos de esta elección, las matrices y los números de punto flotante, se inspiraron en las decisiones de diseño.
El estándar IEEE 754 para números de coma flotante no se adoptó hasta 1985, y la memoria se midió en kilobytes, no en gigabytes. Los números de punto flotante doble no eran la forma más eficiente de mostrar caracteres o enteros, pero eran lo que los científicos, ingenieros y todos los matemáticos querían usar la mayor parte del tiempo. Además, las variables no deben declararse y la memoria no debe asignarse. Al permitir que su computadora maneje estas tareas y deshacerse de los tipos de datos, liberó a su cerebro para pensar en algoritmos que funcionen con los datos.
Las matrices son importantes porque los algoritmos numéricos en álgebra lineal tomaron sus propias formas
LINPACK y
EISPACK . Pero acceder a ellos con un medio estándar en informática científica, FORTRAN 77, fue un proceso de varios pasos que implicó declarar variables, invocar nombres ocultos de rutinas, compilar código y luego analizar datos y archivos de salida. Registrar la multiplicación de matrices en forma de A * B y enumerar la respuesta inmediatamente condujo a un cambio en el curso del juego.
MATLAB también hizo que los gráficos fueran simples y abiertos. No hay bibliotecas complejas dependientes de la máquina con llamadas de bajo nivel, solo trace (x, y), y vio lo que alguien más habría visto con MATLAB. Hubo incluso más innovaciones, como números complejos complejos, matrices dispersas, herramientas para crear interfaces gráficas de usuario multiplataforma y un conjunto avanzado de solucionadores de EDO que hicieron de MATLAB un lugar para la computación científica a la velocidad del pensamiento.
Sin embargo, un diseño que era ideal para la computación interactiva, incluso los largos, no siempre contribuyó a escribir programas buenos y productivos. Mover datos entre muchas funciones requería manipular una variedad de variables y acceder con frecuencia a la documentación de los argumentos de entrada y salida. Una función por archivo en el disco en un espacio de nombres plano era muy simple para un proyecto pequeño, pero un dolor de cabeza para uno grande. Ciertos patrones de programación (vectorización, preasignación de memoria) deberían haberse aplicado si desea evitar problemas con la velocidad computacional. La informática científica se aplica actualmente a un número mucho mayor de áreas con una gran cantidad de diferentes tipos de datos. Etc.
En respuesta, MathWorks continuó innovando en MATLAB: funciones integradas, funciones anidadas, variables finales, numerosos tipos de datos, funciones orientadas a objetos, infraestructuras de prueba de unidades, etc. Cada innovación fue probablemente una solución a un problema importante. Pero la acumulación de 40 años de estos cambios tuvo el efecto secundario de difuminar la simplicidad y la unidad del concepto. En 2009,
escribí un libro que cubría los conceptos básicos de MATLAB bastante bien en menos de 100 páginas. Hasta donde yo sé, todas estas cosas todavía están disponibles. Pero necesitas saber mucho más ahora para llamarte profesional.
Pitón
En parte, la historia de Python es una imagen especular de la historia de MATLAB. Ambos idiomas tenían una línea de comando interactiva (ahora se llama REPL es una abreviatura de bucle de impresión de lectura-evaluación, que se traduce como un bucle de lectura-evaluación-impresión, así como la libertad de varias declaraciones y compilaciones. Sin embargo, MatLab se creó principalmente con un ojo en la informática análisis, mientras que Python fue creado para hackers. Luego, cada uno de los idiomas pudo expandir su base de usuarios actualizando y expandiendo la funcionalidad.
En mi opinión, Python todavía sufre la pobreza de su aparato matemático. Contiene cosas tan incómodas como la presencia de ** en lugar de ^, @ se usa para multiplicar matrices (¡se agregó recientemente!), No el tamaño, sino la forma de la matriz, el almacenamiento orientado a filas, etc. Si crees que V.conj (). T @ D ** 3 @ V es más elegante que V ∗ D
3 V, entonces lo más probable es que no estés bien con tu cabeza. Además, la indexación comienza en 0 (en lugar de 1). Tuve ocasión de conocer la
opinión opuesta , sin embargo, en mi opinión, no es tan convincente. Obviamente, todo esto es una cuestión de preferencia personal, un tema de guerras santas en Internet, ya que siempre puedes dar un ejemplo engorroso a tu ventaja, ¿qué es exactamente para mí? parece convincente, porque durante décadas siempre hemos comenzado la indexación matemática de vectores y matrices con 1, y muchos pseudocódigos se basan en esta suposición.
Además de algunos inconvenientes, considero que el sistema Python + NumPy + SciPy es engorroso e inconsistente, un buen ejemplo es el hecho de que a pesar del fuerte enfoque en el objeto, existen clases de matriz y
no se recomienda su uso , tal vez MatLab me estropeó así, pero considero que las matrices son un objeto importante que se debe tener a mano y usar activamente. ¿No es la capacidad de usar * para realizar varias operaciones con matrices y matrices la característica principal de OOP? En general, hay muchos momentos desafortunados a este respecto, (¿por qué necesito el comando
spsolve ? ¿Por qué no puedo simplemente aplicar el comando resolver a una matriz dispersa? Y todavía hay mucho de eso).
También hay lugares donde el ecosistema numérico se ve un poco peor. Por ejemplo, los
solucionadores cuadrados y
ODE parecen minimalistas en 2019. Por lo que puedo decir, no hay métodos para DAE, DDE, solucionadores simplécticos o implícitos que permitan las iteraciones internas de Krylov. Mire, estas funciones son en su mayoría de 30 años o más, siguen siendo buenas, pero están muy lejos de ser perfectas. Matplotlib es un paquete increíble para trabajar, y en algunos casos se veía mejor que MATLAB, pero extraño 3D.
Algunos expertos sostienen que hay razones por las cuales el código Python está tratando de combatir la velocidad con lenguajes compilados. Me sorprende el resultado de la búsqueda "
Python es demasiado lento ". Los campeones de Python citan muchos de los argumentos / disculpas que la gente hizo por MATLAB en ese entonces. Esto no significa que estén equivocados, pero es más que un simple
problema de percepción .
Entiendo por qué Python fue tan emocionante para muchas personas en informática científica. Tiene cierta sintaxis y el poder de MATLAB, disponible en REPL. Cuenta con excelentes herramientas y funciona bien con otros idiomas y áreas de computación. Lo ofreció de forma gratuita y con una reproducibilidad a largo plazo mucho mejor. Obviamente, esto funciona bien para muchas personas que probablemente ven pocas razones para el cambio.
Debido a lo que sé hacer en computación científica, Python me obliga a hacer un trabajo más rutinario de aprendizaje y uso del que estoy acostumbrado. Durante algún tiempo no sabremos si continuará en la comunidad o si ya está cerca de su punto máximo.
Julia
Julia tiene sus ventajas y desventajas ya que es tarde. Admiro a los creadores de Julia por entender que
podrían hacer másQueremos un idioma de código abierto con una licencia de biblioteca. Queremos velocidad C con dinámica Ruby. Queremos que el lenguaje sea homoionico, con macros reales como Lisp, pero con notaciones matemáticas obvias y familiares como en Matlab. Queremos algo tan programable como Python, tan simple para las estadísticas como R, tan natural para el procesamiento de cadenas como Perl, tan poderoso para el álgebra lineal como Matlab y capaz de pegar programas juntos como un shell . Algo fácil de aprender, pero al mismo tiempo agrada a los hackers más serios. Queremos que sea interactivo y queremos que se compile.
Creo que en gran medida han tenido éxito. Para el lanzamiento de la versión 1.0, parecían ser ligeramente diferentes de REPL y de MATLAB. (¿Qué tan exacto es LinRange mejor que linspace?) Aunque es una trampa.
Este es el primer idioma que he usado, con la capacidad de ir más allá de ASCII. Obtengo una satisfacción excesiva por el uso de variables como Phi y operadores como ≈. Es más que un hermoso envoltorio; poder parecerse más a las expresiones matemáticas que escribimos es una verdadera ventaja, aunque complica un poco el aprendizaje y la documentación.
Jobs en Julia me mostró que adquirí algunas habilidades de programación debido a la elección de MATLAB, y no debido a su superioridad inherente. La vectorización no es natural para muchas cosas. Julia revela que puede vectorizar cualquier función simplemente agregando un punto a su nombre. Construir una matriz usando la
comprensión hace que los bucles anidados (o los trucos de la cuadrícula) parezcan látigos erróneos en comparación, y omitir la matriz en su conjunto con un
generador para una suma simple es como obtener algo por nada. (Sé que Python tiene características de lenguaje similares).
La gran característica del
envío múltiple hace que algunas cosas sean mucho más fáciles y más comprensibles que la orientación del objeto. Por ejemplo, suponga que tiene las clases Wall y Ball en un lenguaje tradicional orientado a objetos. ¿Qué clase debería detectar la colisión de una pelota con un muro? ¿O necesitas una clase para jugar el árbitro? Preguntas como esta pueden distraerme. Con la programación múltiple, los datos se empaquetan en tipos de objetos, pero los métodos que funcionan con datos no están vinculados a una clase. Entonces
función detect_collision (B :: Ball, W :: Wall)
conoce los tipos, pero se determina independientemente de ellos. Me llevó mucha programación comprender lo interesante y potencialmente importante que es el concepto de despacho múltiple para expandir el lenguaje.
El ecosistema numérico se está desarrollando rápidamente. Mi ejemplo número uno es
DifrentialEquations.jl , escrito por el maravilloso
Chris Rakautskas . Si este software no gana el Premio Wilkinson en el corto plazo, el sistema no funciona. Simplemente vaya al sitio y prepárese para apelar.
Todavía no he visto las grandes ganancias de velocidad sobre MATLAB que Julia promete. Esto es en parte mi relativa inexperiencia y el tipo de tareas que realizo, pero en parte porque MathWorks ha hecho un trabajo increíble al optimizar automáticamente el código. En cualquier caso, este no es el aspecto de la codificación en el que me centro la mayor parte del tiempo.
La programación en Julia me llevó un tiempo sentirme cómoda (tal vez me estoy haciendo viejo y cristalizando). Esto me hace pensar en los tipos de datos más de lo que me gustaría, y siempre hay una sospecha de que no vi la forma correcta de hacer algo. Pero para el uso diario, lo más probable es que recurra a Julia como MATLAB.
Resumen
MATLAB es una solución corporativa, utilizada principalmente para resolver problemas de ingeniería. Sigue siendo la herramienta más simple para resolver problemas numéricos. Documentación muy importante y el desarrollo de diez años de la compañía, sin duda, juegan un papel importante en esto.
MATLAB es como un sedán BMW del mundo de la informática científica. Es costoso, incluso antes de hablar de accesorios (kit de herramientas). Usted paga por una operación y servicio impecables e ininterrumpidos. Pero también atrae una
cantidad desproporcionada
de odio .
Python es una camioneta Ford. Es omnipresente y querido por muchos (en los EE. UU.). Puede hacer lo que quiera, y está diseñado para hacer lo que otros autos no pueden hacer. Lo más probable es que lo quieras de vez en cuando. Pero eso no te da mucha experiencia de manejo.
Julia es Tesla. Está construido con el audaz propósito de cambiar el futuro, y es posible. Pero también puede ser solo una mención. Al mismo tiempo, llegarás a donde estás con estilo y con una gran cantidad de fuerza.

Lee también el blog
Empresa EDISON:
20 bibliotecas para
espectacular aplicación para iOS