14 de mai. de 2009

matlab + java: Parte 1

1 - Introdução:
O matlab possui um ótima integração com a linguagem Java, que pode ocorrem em duas direções. Podemos chamar o engine do Matlab e suas rotinas dentro de aplicativos Java e também podemos utilizar classes Java no Matlab. Neste tutorial trataremos a segunda abordagem.

Embora o Matlab apresente um grande número de recursos, muitas vezes nos deparamos com situações em que é necessário desenvolvermos nossos métodos. A utilização de rotinas externas ao Matlab são de grande valia para rotinas em que desempenho é necessário. Para isso, temos o MEX, compilador de C para matlab que permite usar rotinas escritas em C dentro do ambiente matlab. usar MEX em gargalos de scripts matlab é uma ótima opção para desempenho.

No caso da linguagem Java, sua utilização no ambiente Matlab, permite trazer os recursos de uma liguagem de uso geral dentro do Matlab, permitindo por exemplo acesso a Banco de dados, redes, interface gráfica e também computação gráfica.

A integração do Java no ambiente Matlab é quase imediata, uma vez que uma boa parte do Matlab foi desenvolvida em Java.

O Matlab acessa naturalmente uma grande quantidade de classes Java. Para ter uma lista das classes, digite o comando javaclasspath . Ele vai apresentar os diretórios de classes que o matlab usa. O matlab pois dois tipos de ligações no classpath: Estáticas (static) e dinâmicas (dynamic). As estáticas são carregadas no início da seção do Matlab, já as dinâmicas, podem ser carregadas a qualquer momento. Em geral as classes de usuários são classes dinâmicas.

2 Primeiro exemplo, integrando Matlab e Java:

O exemplo a seguir demonstra o uso de uma classe Java no Matlab.

A classe exemplo_matlab, cujo código é apresentado a seguir, apresenta dois métodos estáticos, checa_primo - que verifica se um determinado inteiro é primo e teste, que apenas incrementa uma variável

listagem de exemplo_matlab.java:

public class exemplo_matlab {

public static boolean checa_primo(int num)
{
int a, //contador
resto; //resto da divisão;
boolean eprimo;
eprimo=true;
if ((num%2)!=0){ //verifica se o número é par
for (a=3;a<num;a+=2){
resto = num%a;
if (resto==0){
eprimo=false;
break;
}
}
} else eprimo=false;
return eprimo;
}

public static int teste(int a)
{
int b;
b = a +1;
return b;
}

}

2.1 Compilando o código Java

Compile o exemplo, entre no terminal do SO (Sistema Operacional) e digite: javac exemplo_matlab.java

No UNIX, linux ou no Macosx o Java do sistema operacional em geral é o mesmo do matlab. Se vc estiver usando windows, o matlab em gera utiliza sua própria JVM que não é a mesma do SO. Neste caso, verifique qual versão de java é a JVM do seu matlab. Para isso no Matlab digite: version -java

compilando no Windows:
No windows em geral a JVM do matlab não é a mesma versão da JVM usada pelo SO. Deste modo, quando compilar a classe, deve-se ter o cuidado de gerar uma versão de bytecode compatível com a versão do matlab (suposta mais antiga que a do SO). Para isso informe no compilador de Java a versão do código Java que vc está compilando e a versão de bytecode que deseja gerar. Veja o exemplo:

javac -source 1.2 -target 1.1 teste_matlab.java

Neste caso, temos um código e compilador de Java na versão 1.2 (SO) e desejamos gerar bytecode para a versão de JVM 1.1

2.2 Chamando a classe no ambiente Matlab
Como primeiro passo, a classe precisa estar listada no classpath do Matlab. Isto pode ser feito de duas formas, alterando o arquivo classpath do Matlab ou então por meio do comando javaaddpath. Vamos usar esta abordagem.

Supondo que a classe está no diretório /Users/estudo_matlab/exemplo_matlabjava, digite:

javaaddpath({'/Users/estudo_matlab/exemplo_matlabjava'});

este comando adiciona um diretório, arquivo ou conjunto de arquivos e diretórios na lista de caminhos dinâmicos. Para verificar como o classpath ficou, digite javaclasspath.

Para rodar o método checa_primo, e verificar se o número 191 é primo use:

primo = exemplo_matlab.checa_primo(191)

a variável primo vai receber true caso 191 seja primo e false no caso oposto.

para usar o método teste e adicionar 1 a variável x,

x = exemplo_matlab.teste(x)

Um comentário:

  1. Odemir, estou com um problema.
    A função java que eu executo dentro do matlab precisa de uma variável de ambiente configurada antes de chegar no matlab. Como essa configuração eu faço pelo próprio eclipse, nele eu consigo rodar, mas quando eu rodo no matlab eu não consigo rodar, pois a variável ambiente não vem configurada.

    Por que preciso dessa variável ambiente? Porque o meu programa java utiliza uma API para comunicação com um hardware, ela acessa uma dll. A variável ambiente é o path dessa dll.
    Outra funções do meu programa java rodam normalmente quando não utilizam essa API.
    Em suma: Em java roda, em matlab não. Tens ideia de como eu resolvo isso?

    No mais, obrigado pelo artigo. Excelente!

    ResponderExcluir