java调用matlab

近期需要java调用matlab程序,花了大半天时间终于完成了一个小程序的测试,与大家分享一下成果

一、在MATLAB中编辑operation.m,

%定义一个函数operation(a,b),求a与b的加减乘除运算,并返回结果

%函数定义function 输出变量列表[s,m,...] 函数名(输入变量列表)sum,sub,mul,div中

function [sum,sub,mul,div] = operation(a,b);

sum = a + b;

sub = a - b;

mul = a * b;

div = a / b;

end

 

二、生成Java调用文件

Matlab命令中输入deploytool,新建一个matlab builder ja文件,在operationclass中添加operation.m文件,点击bulid the project,生成一个供java调用的文件夹结构如下:

Operation -----|----distrib

|     |-----operation.jar

|       |-----readme.txt

                |

                 -------src

                  |           |----operation

                  |                   |----operationclass.java

                  |                   |----operationMCRFactory.java

                                      |----operationclassRemote.java

               |           |----classes

                  |                   |----operation

                  |                                    |----operation.ctf

                  |                                   |---- operationclass$1.class

                                                      |---- operationclass.class

                                                      |---- operationclassRemote.class

                                                      |---- operationMCRFactory.class

|-------build.log

|-------operation.ctf

| -------operation.jar

|-------mccExcludedFiles.log

|-------readme.txt

 

三、Java中建立一个java project工程JavaTestMatlab,导入两个库文件javabuilder.jar(C:\ProgramFiles

      \toolbox\javabuilder\jar)和operation.jar(D:\My Documents\MATLAB\operation\distrib\ operation.jar),

   编写java程序JavaTestMatlab.java程序如下:

/*java 调用matlab程序
* author:farseer
* EMail:zhf0374@126.com
* 从键盘输入两个整数,调用operation.m中的函数operation(a,b),求出两个数的各、差、积、商并输出
*/

import operation.*;
import java.util.Scanner;
class JavaTestMatlab
{
    public static void main(String[] args)
    {
        Object result[] = null;    /* object是所有类的父类public Object[] operation(int nargout, Object... rhs) */
        operationclass myAdd = null;     /* Stores myadd class instance */
        try
        {
            int a,b;
        myAdd = new operationclass();
       
            System.out.println("从键盘输入两个操作数:");
            System.out.print("      输入第一个操作数:");
           Scanner scan = new Scanner(System.in);   //从控制台读入输入的整数
            a = scan.nextInt();       //从控制台输入第一个操作数
           System.out.print("      输入第二个操作数: ");
            b = scan.nextInt();     //从控制台输入第二个操作数
          
            result = myAdd.operation(4,a,b); //operation(4,a,b)中第一个参数是返回值的个数 ,a是第一个输入参数,b是第二个输入参数
            System.out.print("The sum of " + Integer.toString(a) + " and " + Integer.toString(b) + " is: ");
            System.out.println(result[0]);
            System.out.print("The sub of " + Integer.toString(a) + " and " + Integer.toString(b) + " is: ");
            System.out.println(result[1]);
            System.out.print("The mul of " + Integer.toString(a) + " and " + Integer.toString(b) + " is: ");
            System.out.println(result[2]);
            System.out.print("The div of " + Integer.toString(a) + " and " + Integer.toString(b) + " is: ");
            System.out.println(result[3]);
       }
        catch (Exception e)
        {
            System.out.println(e);
        }     
    }
}

 

测试结果如下:

从键盘输入两个操作数:

      输入第一个操作数:55

      输入第二个操作数: 22

The sum of 55 and 22 is: 77

The sub of 55 and 22 is: 33

The mul of 55 and 22 is: 1210

The div of 55 and 22 is: 3

 

四、 错误调试

1.    安装matlab不完整,没有toolbox\javabuilder下的文件

2.    环境变量中classpath中添加两个jar文件的路径  

 

 

 

 

 

 

例子二:转自:http://kakadu.blog.51cto.com/4050768/750248

 由于课题的原因,又要搞搞java。好久没开eclipse了,觉得好陌生,尤其是当要用this的时候,你抖抖索索鬼使神差地敲了个self上去。。

      啰嗦完毕,java画了个界面,核心算法是用matlab写的,所以必须调用matlab代码。网上找了些资料,似乎很少有针对matlab 2010a版本的,总结了下,方法如下:

     首先请保证java已正确安装并且设置了环境变量。关于环境变量的设置,网上一堆介绍,比如http://www.233.com/ncre2/JAVA/jichu/20091220/090015124.html,这里就不再赘述。然后请保证matlab的版本支持MATLAB Builder for Java,可以在matlab的命令窗口输入deploytool,如果提示命令无效,则说明版本不支持。我原来用的7.1的就不支持,所以改装了2010a。

       基本工作完成后,let's begin!

       首先在matlab中新建个.m文件,随便写个算法,我们就用个简单的sum函数吧。.m文件中语句为:

function data = mysum(vec) data = sum(vec)

将该文件保存,命名为mysum.m。

然后在matlab中菜单栏 File-->new-->Deployment Project 或者如上述在命令行输入deploytool。出现界面如下:

注意这里一定要选择Java Package。Name一项中为所生成的jar文件名称,会在后面eclipse中调用时用到,所以谨慎命名。

随后,在matlab的Deployment Tool对话框中选择Build,然后add files,将我们之前所保存的mysum.m文件添加进去。

再点击Package标签,这里注意,一定要点Add MCR,然后将默认的MCR包含进去。否则在eclipse中编译的时候找不到类库。

然后开始编译jar文件,点击Deployment Tool窗口右边的build按钮。

 

build完成之后,会在你之前设定的路径下生成一个文件夹,里面包含了jar文件、所有的class文件、java文件等等。

然后在eclipse中你需要调用matlab代码的工程中导入外部jar包,注意,这里还需要到matlab安装目录下找到javabuilder.jar,一同导入。(网络上有很多,不再赘述)

在你调用方法的类中import两个包,一个是javabuilder,另一个是我们自己生成的lcxTest。

//import matlab jar import lcxTest.*; import com.mathworks.toolbox.javabuilder.*;

相关调用示例代码如下:(部分采用了上述链接中的代码,作了适当调整)

 

//import matlab jar import lcxTest.*;

import com.mathworks.toolbox.javabuilder.*;

相关调用示例代码如下:(部分采用了上述链接中的代码,作了适当调整)

Object[] x = null;

  Object[] result = null;  

  lcxTest.Class1 lcx = null;

 try
       {
          x = new Object[3];
        x[0]=1;
        x[1]=2;
        x[2]=3;

 lcx = new lcxTest.Class1();
 //         Compute magic square and print result
          result = lcx.mysum(1,x[1]);  //1表示输出一个东西
          System.out.println(result[0]);
          double res=((MWNumericArray)result[0]).getDouble(1);//转换成java的数据类型
          System.out.println("res is: "+res);
       }
       catch (Exception e)
       {
          System.out.println("Exception: " + e.toString());
       }
       finally
       {
 //          Free native resources
           MWArray.disposeArray(x);
           MWArray.disposeArray(result);
           if (lcx != null)
            lcx.dispose();
        }

 

这样就可以成功调用matlab 2010a版本的.m文件了,说起来也不难。不过编译速度真是个问题。。另外,调用之后,原来的java风格的界面会自动变成windows风格。

end

posted @ 2013-04-14 13:48  xjx_user  阅读(846)  评论(1编辑  收藏  举报