Integrando MATLAB en nuestras aplicaciones Java (I)

21 05 2011

Quería iniciar con este post la primera parte de un pequeño tutorial sobre cómo ejecutar código fuente escrito en MATLAB desde Java. Aunque es cierto que en la mayoría de los cálculos que hay que llevar a cabo son de baja complejidad y pueden llevarse a cabo directamente con Java, es posible que en un momento determinado necesitemos calcular expresiones matemáticas más complejas.

En mi caso, lo que me motivo a buscar información sobre este tema no fue tanto el querer hacer cálculos desde Java, sino diseñar en Java mediante componentes Swing la interfaz gráfica de un programa escrito en MATLAB, pues, aunque bien es cierto que éste último cuenta con un editor incorporado llamado guide, deja bastante que desar si lo que se desea es un resultado más o menos profesional.

Antes de nada me gustaría aclarar que todo lo aquí expuesto no es más que una traducción/recopilación de lo visto en otras páginas webs, especialmente de la propia web de MATLAB. http://www.mathworks.com/help/toolbox/javabuilder/ug/brlu1as-1.html. Dicho esto, comenzamos.

¡Hola mundo!

En un alarde de original el ejemplo sobre el que va a girar esta primera parte será el más que clásico Hola Mundo. La idea será escribir un código en MATLAB que imprima en pantalla dicho mensaje para luego ejecutarlo desde Java. Lo primero que hay que hacer por lo tanto es escribir dicho código. Hay que recordar que, en principio, tiene que estructurarse el código en forma de funciones, de forma que luego puedan ejecutarse desde nuestra aplicación Java.

Escribimos el siguiente código en MATLAB en un fichero que llamaremos helloWorldClass.m:

function helloWorldFunction
    fprintf(1,'Hello World!\n' );

Como se observa el código no tiene ningún misterio. A continuación hay que convertir este código en otro que pueda ejecutarse desde java. Para ello, basta con ejecutar el comando deploytool. Nos aparecerá ahora un menú como el que se muestra en la siguiente imagen:

Cuadro de diálogo para crear un paquete Java desde MATLAB


Como veis, es un cuadro de diálogo sin mucho misterio. Para seguir el ejemplo lo ideal sería que lo dejaseis con los mismos valores que aparecen en la imagen. A continuación nos aparecerá una ventana en la que deberemos indica qué clases queremos crear y qué ficheros .m contendrá cada una. Por lo tanto, hacemos clic en el enlace Add class y le damos el nombre que queramos, como por ejemplo, HelloWorldClass. A continuación añadimos el fichero .m creado previamente a dicha clase mediante Add files.

Hecho esto sólo resta clicar en el botón de Build situado en la parte superior de la ventana del deploytool. Si todo ha ido bien, tras un tiempo relativamente pequeño tendremos nuestro paquete Java listo para usar.

Para programar en Java yo empleo el entorno de desarrollo NetBeans, así que lo explicado a continuación supondrá que también vosotros lo usáis. No obstante se puede hacer también sin mayores problemas en otros entornos.

Creamos un nuevo proyecto Java y añadimos como librería el fichero .jar que se creó mediante deploytool y que se encuentra en el directorio c:\helloworld\contrib. Debe añadirse también de la misma forma el fichero javabuilder.jar, que puede encontrase en directorio_raiz_de_matlab\toolbox\javabuilder\jar.

Hecho esto, basta con añadir a nuestro código las siguientes líneas:

import com.mathworks.toolbox.javabuilder.*;
import HelloWorldProject.HelloWorldClass; 

En este momento, estamos listos para poder ejecutar nuestro código MATLAB desde Java. Para ello hay que limitarse a crear un objeto de la clase HelloWordClass y llamar a la función que nos interese, como se muestra en el siguiente ejemplo:

HelloWorldClass helloWorld = new HelloWorldClass();
helloWorld.helloWorldFunction(1);
if (helloWorld != null) {
    helloWorld.dispose();
}

El código es muy sencillo: como dijimos, se limita a crear un objeto y a llamar a una de las funciones que contiene, en este caso, helloWorldFunction, que fue la que definimos previamente en el fichero .m. Finalmente se liberan los recursos ocupados. Tengo que comentar que desconozco el sentido del parámetro que se pasa como argumento a nuestra función, pero venía así con los ejemplos de la web de MATLAB y sin él no funciona.

Con esto llegamos al final de la primera de las partes de este minitutorial. Espero que os haya gustado y que estéis al tanto de las partes que faltan.

Actualización: comentaba más arriba que no sabía cuál era la misión del primer parámetro que se le pasa a la función MATLAB desde Java. Parece ser que indica el número de variables que va a devolver la función, lo cual explica que el valor más habitual sea uno.

Advertisement

Acciones

Información

15 respuestas

25 05 2011
edén

Muy interesante el post. Estaré atento a los siguientes.
Quería preguntarte algo relacionado. Tengo que implementar un programa de analisis de imagen en java. Ya lo he programado en matlab, pero no tengo ni idea de programar en java, ¿sabes si hay alguna forma de (o si es posible) “convertir” este código a lenguaje java ? ¿o tendré que aprender a programar en éste lenguaje? Espero que puedas ayudarme. Gracias.
Saludos.

25 05 2011
Fernando

Hola edén:
Muchas gracias por tu comentario. Respecto a tu pregunta, puedes convertir el código que tienes en MATLAB en un paquete Java y llamarlo desde ahí. Si lo que quieres es alguna aplicación que pase tu código MATLAB a otro código Java que pueda ejecutarse directamente, hasta donde sé creo que no es posible y tendrás que, como te digo, crear primero el paquete y luego usarlo desde Java, lo cual no tiene mucho misterio como viste en el post.

No sé si será tu caso, pero si lo que necesitas, más que un código Java, es un código que pueda ejecutarse solo, sin necesidad de MATLAB, estoy casi seguro de que eso sí se puede hacer, pero tendría que mirar cómo. Dime si es éste tu caso para mirarlo más a fondo.

Un saludo.

27 05 2011
Pedro

Hola estoy haciendo el proyecto de final de carrera y tengo una duda muy grande, la cosa es que tengo realizados varios programas con guide sobre calculo de motores, la cosa es que quiero que se puedan usar desde internet explorer sin necesidad de matlab, se puede hacer?, es que me pongo a realizar el ejemplo que pones y me pierdo cuando usar el programa java, un saludo

27 05 2011
Fernando

Hola Pedro:
Según acabo de leer en la web de MATLAB, el soporte expreso para aplicaciones web se abandonó en la versión 2006 y lo que se usa ahora, según parece, es la creación de paquetes Java o Net, según necesites, para ejecutarlo luego desde la red. Luego supongo que tendrías que programar algún applet que te permita ejecutar ese código Java en un navegador.

En cualquier caso, lo primero es generar el paquete Java, así que si quieres coméntame dónde te pierdes al seguir el post y te comento.

Un saludo.

30 05 2011
Pedro

Hola muchas gracias por contestar por que la verdad es que estoy perdido, bueno pues te comento.
Me pierdo a partir de donde comienzas a usar el netbeans, ya que nunca lo use y no se como hacer para que el paquete java de matlab pueda usarlo en internet explorer sin usar matlab, es posible eso?.
y otra pregunta cuando creas el paquete java de matlab que archivos deben aparecer?, muchas gracias por todo

30 05 2011
Fernando

Hola Pedro, te comento:
Vaya por delante que nunca hice lo que comentas de ejecutar un código de MATLAB desde la web, así que toma lo que te diga con alfileres. Como te había comentado, parece ser que desde la versión 2006 se eliminó el soporte propiamente para aplicaciones web y, desde entonces, la solución pasa por generar primero un paquete Java o .NET. En este caso, supongamos que creamos un paquete Java.

La cuestión es si, una vez creado dicho paquete Java, puede ejecutarse desde la web. Como te comentaba, nunca ejecuté código Java desde la web, pero en principio debería poder hacerse sin mayores problemas mediante un applet Java. Por lo tanto, lo que deberías hacer es, como te comento, generar el paquete en Java y luego programar el applet.

Con respecto a los archivos que se generan al compilar el paquete, el que te interesa es el fichero .jar que aparece en la carpeta distrib. Ese el que debes incluir en tu proyecto.

Siento no poder ser más concreto, pero con respecto a la parte de applets no sabría decirte más que lo que puedas encontrar buscando “applet java” en Google. Si tienes alguna duda más con respecto a la generación del paquete Java desde MATLAB no dudes en comentármela.

Un saludo.

7 06 2011
Pedro

Hola no me sale la carpeta distrib. encuentro el archivo .jar en la carpeta src, no se creo que no lo hago bien, los pasos basicos son si tengo el archivo.m, abro el matlab building ja, y habro el archivo que tengo, y en clase y lo demas tengo que cambiar algo?, estoy hecho un lio.
gracias

7 06 2011
Fernando

Hola:
No sé a qué te refieres con MATLAB Building JA, pero supongo que será el deploytool. Si es así, sólo tiene que añadir una clase y a esa clase añadir los ficheros .m que contengan las funciones que necesites. Luego sólo queda clicar en el botón Build.

No obstante, si tienes un fichero .jar con el nombre del proyecto que creaste, me atrevería a decir que es ese, pues en principio no debería generarte ningún otro fichero .jar. Así que yo emplearía ese fichero, pues posiblemente sea el correcto.

Un saludo.

7 06 2011
Pedro

Vale ya lo tengo todo creado, y tengo la carpeta distrib y el archivo .jar dentro.
esque tanto tiempo delante del pc me tiene un poco atontado, ahora mi pregunta, yo lo que quiero conseguir es que cualquier persona pueda usar el programa sin tener matlab.
por eso lo queria compilar en java, es posible conseguir eso?.
un saludo y gracias por todo

7 06 2011
Fernando

Sí, claro. Ahora puedes usarlo desde Java como cualquier otro paquete y MATLAB ya no es necesario. Sólo tienes que incluirlo en tu proyecto Java y ejecutarlo desde ahí.

Un saludo.

10 06 2011
Pedro

Hola imposible de ejecutarlo, ya probe a realizar el applet pero no hay manera.
entonces e visto que hay otra opcion de hacer ejecutables, he probado y me funciona pero el guide lo tengo enlazado con una simulacion .mdl y es hay donde esta el problema que no se combertirlo con ese archivo añadido y no hace los calculos, un saludo no se si sabes como funciona el ejecutable pero es que es mi unica opcion si no me funciona el otro, un saludo y gracias

10 06 2011
Pedro

te dejo otra aclaracion por que creo que no se entiende bien basicamente tengo un archivo .m y uno .mdl los dos enlazados ok y quiero que al hacerlos ejecutables funcionen ambos, bueno no se si sabras como funciona eso pero es lo que voi a intentar, un saludo

10 06 2011
Fernando

Pues la verdad es que nunca generé un ejecutable a partir de código MATLAB, y menos aún enlacé dos. De todas formas, aquí te dejo un tutorial que encontré en YouTube donde parece que explica bastante bien cómo generar un .exe a partir del código .m.

Un saludo.

10 06 2011
Pedro

no veo el enlace, un saludo

10 06 2011
Fernando

Disculpa, se me olvidó pegarlo. Aquí lo tienes: http://www.youtube.com/watch?v=xfMXWCX6Ei4

Un saludo.

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.