Integrando MATLAB en nuestras aplicaciones Java (y II)

27 05 2011

Aquí os traigo la segunda y última entrega de este minitutorial de intregación de MATLAB y Java. En un principio tenía pensado hacer una serie más larga, pero estoy viendo que muchos de los temas que se tratan en el tutorial de la web oficial de MATLAB son relativamente avanzados. En principio mi idea era limitar a introducir con algún ejemplo sencillo la conexión básica entre estos dos sistemas y creo que con este otro post quedan más que cubiertos mis objetivos.

Esta nueva entrega vamos a hablar de la transferencia de información entre MATLAB y Java. En el ejemplo del post anterior programamos un HelloWorld que, aunque ilustrativo, no trata un tema fundamental como es el intercambio de información entre los códigos de uno y otro lenguaje. En esta ocasión vamos a implementar un sumador, de forma que desde la aplicación Java se llame a una función MATLAB que sume los dos números que le pasemos como parámetros y que nos devuelva el resultado de la operación.

Sumador

Dado que en post anterior ya expliqué cómo generar el paquete Java, en esta ocasión me limitaré a explicar qué hay que hacer profundizar mucho en el cómo. Vamos a implementar un sumador, así que lo primero es programar el código MATLAB, al cual llamaremos add.m:

function [total] = add(a, b)
    total = a + b;
end

Como se observa, el código no tiene ningún misterio y se limita a sumar los dos números que pasamos como parámetros. Generamos mediante deploytool un paquete Java de nombre AdderProject y le añadimos una clase AdderClass que contenga el fichero add.m

En el código Java, una vez incluido la librería y el paquete MATLAB que acabamos de crear, basta con incluir el siguiente código:

    double a, b;
    Object[] results = null;
    Adder adder = new Adder();

    double a = 4;
    double b = 7;

    results = adder.add(1, a, b);

    MWArray result = (MWNumericArray) results[0];
    double[][] total = (double[][]) result.toDoubleArray();

Antes de comentar el código aquí expuesto, quiero aclarar que ésta no es la única forma de pasar y recibir datos a/desde MATLAB. De hecho, en la documentación oficial se habla de diferentes métodos. En esta guía he optado por emplear el más sencillo de ellos, pues resulta suficiente a efectos de comprender el funcionamiento de la aplicación.

El código anterior se limita a definir dos variables de tipo double: a y b, que serán los valores que vamos a sumar. En general, el tipo de datos double será el que tenga una conversión más natural entre MATLAB y Java, y por ello será el que utilicemos en lugar de otros como int, que podrían usarse perfectamente en este caso.

A continuación, se llama a la función add con los parámetros 1, a, b. En la entrega anterior había comentado que no tenía claro qué indicaba el uno del principio. Al parecer, sirve para definir cuántos datos devolverá la función. En nuestro caso, únicamente esperamos recibimos uno: el resultado de la operación. Como se observa, los parámetros se pasan directamente sin hacer ningún tipo de conversión, pues se está haciendo uso de la conversión automática que, aunque menos eficiente, es muy sencilla de emplear.

El resultado devuelto por la función se almacena en una variable de tipo Object[]. Como ya supondréis, es un vector que contendrá todos los valores devueltos por la función.

Posteriormente se crea un objecto de tipo MWArray, que contendrá uno y sólo uno de las variables devueltas. Por lo tanto, nos limitamos a escoger la que deseemos del array results, en este caso la primera y única, y la convertimos a MWNumericArray. Hecho esto, nos limitamos a convertirla en un array bidimensional de tipo double, donde almacenaremos el resultado de la suma ya listo para su empleo en Java.

Merece la pena reseñar que en MATLAB cualquier tipo de dato es una matriz. Por lo tanto, al recuperar los datos desde Java se hace como matriz también, aunque en este caso sea de dimensión 1×1.

Con esto doy por concluida esta pequeña guía de integración de MATLAB y Java. Sé que he dejado muchas cosas en el tintero, pero en principio esto es suficiente para la mayoría de aplicaciones. En cualquier caso, no dudéis en comentarme las dudas que tengáis e intentaré responderos.

Advertisement

Acciones

Información

Deja un comentario

Fill in your details below or click an icon to log in:

Logo de WordPress.com

You are commenting using your WordPress.com account. Log Out / Cambiar )

Twitter picture

You are commenting using your Twitter account. Log Out / Cambiar )

Facebook photo

You are commenting using your Facebook account. Log Out / Cambiar )

Connecting to %s




Seguir

Get every new post delivered to your Inbox.