JAVA与MATLAB混合编程


MATLAB的程序文件为.m文件,可在MATLAB环境下直接运行,但不能够被JAVA直接调用。利用MATLAB的编译器扩展功能,可将.m文件编译成JAVA能够直接调用的.class文件包.JAR。JAVA在调用通过.m转化而来的.class文件时,需要在运行JAVA的主机中安装随同MATLAB软件包一同发布的MCRInstaller环境支撑程序。此外,JAVA与MATLAB混合编程时由于两种语言中的数据类型不能一一对应,因此,在数据交换时会存在数据类型转换的问题。

  将.m文件编译为.class文件        

鼠标左键单击MATLAB菜单“File/New/Deployment Project”选项,在创建工程的对话框左边选择“MATLAB Builder  JA”,输入工程名称并选择工程文件保存位置后单击“OK”按钮,建立工程,如图1所示。

鼠标右键单击“Deployment tool”窗口中与工程名同名的文件夹,选择“add file”将已经建好的.m文件加入工程,然后鼠标左键单击“Deployment tool”窗口的快捷按钮“Build”,对工程进行编译。编译将.m文件编译为.class文件,并将其打包成JAR文件。
     编译结束后,在MATLAB工程文件所在位置将生成两个文件夹“distrib”和“src”,其中“distrib”中包含与工程同名的JAR文件,“src”中包含实现功能相同的MATLAB和JAVA源文件,备开发人员参考。

  JAVA对MATLAB程序的集成        

创建JAVA工程,在调用MATLAB程序功能的类中引用安装MCRInstaller后所产生的“javabuilder.jar”和MATLAB工程文件夹“distrib”中的.jar文件。假设MATLAB工程所产生的JAR文件为“analyse.jar”,则引用语句如下。
import  com.mathworks.toolbox.javabuilder.*;
     import analyse.*;
       同时在JAVA工程的库搜索路径中加入“javabuilder.jar”和“analyse.jar”的路径。
  在JAVA中定义以.m文件名为类名的对象,假设类名为“Analyse”,则定义对象和产生对象实例的语句如下。
  Analyse theMagic = null;
       theMagic = new Analyse();
       调用MATLAB程序功能的语句如下。
  result= theMagic.makeResult(1,data);
       其中,result为接收返回数据的Object型对象,1表示传递给makeResult函数的参数个数为1,data表示传递给makeResult函数的数据参数。
  经过上述过程,实现JAVA集成MATLAB程序的功能,其中,JAVA将result中以Object形式存储的数值进行转换,就可以得到MATLAB传递给JAVA的返回值。

  JAVA与MATLAB数据交换          

Mathworks公司开发了一个供JAVA使用的包“com.mathworks.toolbox.javabuilder.MWArray”, 来解决JAVA与MATLAB混合编程时的数据类型转换。该包中包含一个JAVA抽象类MWArray,该类有MWNumericArray、MWLogicalArray、MWCharArray、MWCellArray和MWStructArray等五个子类,这五个子类均以数组形式存储一组值,这些值可以为数值型、逻辑型、字符型、细胞型或者结构型。
  JAVA程序在调用MATLAB程序之前,应该将要传输的数据按照类型先转换为这五个子类中的一种,然后对MATLAB程序进行调用。下面根据不同的情况,对两者之间数据的交换方式进行说明。

  JAVA向MATLAB传递参数          

这种情况是指程序的功能已经用MATLAB函数的形式实现,调用该MATLAB函数时需要提供参数。此时,JAVA在调用该MATLAB函数之前,应该将要传递的参数按照类型要求存入MWArray的相应子类的对象中,然后以“参数个数,参数”的形式调用MATLAB函数。
     例如,MATLAB函数为matfun(n),其中n为浮点型,位于matfile.m文件中。JAVA程序调用该函数代码片段如下。
MWNumericArray n =  null;?? /* 存储输入参数 */
Matfile theProg =  null;???? /* 存储Matfile类实例 */
n = new MWNumericArray(6.237,  MWClassID.DOUBLE);
     /* 产生存储输入参数的实例,并将参数6.237存入 */
theProg = new Matfile ();?? /* 产生Matfile类实例 */
theProg.matfun(1, n);
     /* 调用函数matfun,1表示参数个数,n为存储参数的实例 */

  MATLAB向JAVA返回结果          

这种情况是指MATLAB函数执行完毕,需要向JAVA程序返回执行结果数据。此时,在JAVA程序中需要定义Object型对象,接收返回数据,然后将其转换后取出。
  例如,MATLAB函数为matfun(),位于matfile.m文件中,执行完毕后返回一列浮点型数据。JAVA程序调用该函数并接收返回值代码片段如下。
Matfile theProg =  null;??? ?/* 存储Matfile类实例 */
Object[]  result = null;????? /* 接收matfun()返回值对象实例 */
theProg = new Matfile ();?? /* 产生Matfile类实例 */
result = theProg.matfun();? /* 调用函数matfun,结果存储在result中*/
double[][] retVal = new double[result.length][]; /* 存储函数返回结果的二维数组 */
for (int k = 0; k <  result.length; k++)? /* 循环次数为返回的数据个数 */
retVal[k] = (double[])((MWArray)result[k]).getData();??
     /* 先将result[k]转换为MWArray类型后通过getData()取出其值,然后将取出的值转换为double[]类型后存入retVal数组 */

  JAVA调用MATLAB的绘图函数          

这种情况是指JAVA程序调用MATLAB的具有绘图功能的函数,在JAVA运行环境中显示MATLAB程序所绘制的图形。
     例如,MATLAB函数为matfig(),位于matfile.m文件中,功能是绘制一幅图形。JAVA程序调用该函数并显示所绘图形的代码片段如下。
Matfile theProg =  null;???? /* 存储Matfile类实例 */
theProg = new Matfile ();?? /* 产生Matfile类实例 */
theProg.matfig();?????? /* 调用函数matfig()绘图 */
theProg.waitForFigures();? /* 在JAVA运行环境中显示图形 */