Programar en GNU Octave (o en MATLAB)

Si uno lee comentarios en las redes sociales sobre la programación en MATLAB/GNU Octave, por ejemplo en Twitter, a veces uno se consigue con la queja:

¿Programar en MATLAB (GNU octave)? – !Eso no es programar!

Y esto me hace reflexionar una y otra vez sobre si de verdad programar en GNU Octave es realmente programar. En mi opinión, todo depende de la definición de programar. Hoy en día, uno puede confundir la programación con OOP (object oriented programming o programación orientada a objetos) o programación con algunos de los lenguajes de programación que se conocen (JAVA, Ruby, PHP, Python, C++, etc.). La mejor definición que encuentro en la siguiente:

Programar es crear un algoritmo diseñado para ser procesado por una computadora (create an algorithm designed for processing by a computer)

Y aquí vienen quizás los dos conceptos fundamentales detrás  de la programación: algoritmo y computadora. De Wikipedia, un algoritmo es:

a self-contained step-by-step set of operations to be performed

esto es, un conjunto auto-contenido de operaciones paso por paso que serán (de alguna forma) ejecutadas. Hacer un algoritmo es independiente de la computadora. Todos ejecutamos algoritmos inconscientemente durante decenas de veces durante el día (p.e. al manejar un automóvil o al preparar una receta). Cuando un algoritmo se lleva a un computador (procesador, microprocesador, PIC, etc.). Es interesante apreciar la definición de computador en Wikipedia:

A computer is a general-purpose device that can be programmed to carry out a set of arithmetic or logical operations automatically.

Es decir, la definición misma de computador depende de la de programación. (Esto me recuerda la definición recursiva del acrónimo PHP.)

Visto así, es claro que hacer algoritmos que se ejecutarán en GNU Octave es un tipo de programación. Además un tipo de programación bien específico como se explica más abajo. MATLAB y GNU Octave están catalogados como lenguajes de cuarta generación por su nivel de abstracción y otras características particulares.

Entonces, ¿por qué la queja? Creo que el caso de GNU Octave/MATLAB amerita una explicación adicional. Creo que la programación en GNU Octave (o en MATLAB) es en cierta forma incomprendida. (Como algunas veces lo es la programación orientada a objetos.)


Prototipos

El lenguaje en el que se basan tanto Octave como MATLAB son excelentes lenguajes para la creación de prototipos rápidos de algoritmos de procesamiento (de datos, generación de gráficos, cálculos, etc., etc.).

Pensar en vectores y matrices

Este lenguaje tiene una particularidad extraordinaria para el caso de la ingeniería y, en cierto sentido, para las ciencias y las matemáticas, este lenguaje está basado en que sus variables no son más que vectores y matrices. De hecho, el diseño de muchos y potentes algoritmos se basa en esta particularidad.

Para precisarlo, más que listas, arreglos ordenados, las variables en GNU Octave (y en MATLAB) pueden verse como objetos puramente (matemáticos) algebraicos. Y de aquí sus ventajas para el diseño de algoritmos que tienen que ver con procesamiento de imágenes, con estructuras, con sistemas lineales, entre tantos otros campos.

Un excelente ejemplo, el cual además generó esta iniciativa es este. Ante la pregunta sobre cómo dividir una matrix de 400×400 en submatrices de 20×20, la respuesta fue:
T = permute(reshape(permute(reshape(A, size(A, 1), n, []), [2 1 3]), n, m, []), [2 1 3])

Una instrucción que transforma una matriz $A$ en una matriz tridimensional $T$, donde cada sección bidimensional T(:, :, i) es una de las secciones de tamaño $m\times n$. El tercer índice en T enumera las secciones en la forma clásica de MATLAB (GNU Octave), submatrices en la misma fila van antes que la siguiente fila de submatrices. Esto se hace para poder seleccionar una submatriz particular. (En la disección de la matriz no se usa ninguna estructura de repetición del tipo for.)

Un ejemplo de la disección de una imagen se muestra aquí. El mismo algoritmo usando mat2cell y repmat es el siguiente (aquí  se muestran mediciones de velocidad de ambos algoritmos):

La comprensión de este algoritmo pasa por una cierta estructura de pensamiento que considero fundamentalmente matemática y muy particular de GNU Octave/MATLAB. ¿De qué manera lo haría Usted?

Acerca de Editor

Ing. de Sistemas con Doctorado en Automática. Enseño circuitos, simulación y teoría de control. Me gusta el modelado de sistemas no lineales y el diseño de leyes de control. Para mi, GNU Octave es un gran herramienta para hacer prototipos y enseñar a pensar.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *