java调用matlab工作以及调试总结

最近由于工作需要,做了一个java调用matlab的jar包,从开始做到测试成功居然花费了2周的时间,中间遇到各种各样的问题,现将过程记录如下:

   工作需求是需要对实际中的一组数据进行分析,预测该数据将来走势,因此用到matlab函数中的polyfit函数进行数据曲线拟合,然后通过polyval函数预测数据走向,编辑matlab函数如下:

function J=function1(b)

num=length(b);

for i=1:num

    a(i)=i;

end

y=polyfit(a,b,2);

num2=2*num;

for j=1:num2

    c(j)=j;

end

J=polyval(y,c);

End

其中b是我们传入的数据,应该为数组形式,J为传出的数据,长度为b的2倍的数组。Function1就是我们定义的函数。

对函数进行测试,在command窗口中输入,b=[2,6,34];J=function1(b);

在workspace窗口结果得出结果J为一1X6数组。

编完后在command窗口中输入deploytool,进行jar包生成。

Name为jar工程名,可自己命名,我命名为function1.prj,type选择java package。在接下来的窗口中添加class,我仍然命名为function1,在class下加入刚刚编写的m文件。

在package窗口中添加mcr,然后点击build,

这里发生第一个错误,jar包创建失败,在网上搜寻帮助时发现此错误与jdk的版本有关,我电脑中原有的1.5版本JDK  导致了这个错误,这里下载了1.6.0_16 版本,生成jar包成功。在matlab文件夹下工作空间中(我的在matlab\bin)生成一个与工程名相同的文件夹,其中有distrib和src两个文件夹,里面的function1.jar就是生成的函数jar包。

接下来在myeclipse中调用,建立java工程(java project),这里jre中的三个选项要调整为生成jar包所使用的jdk版本。将工程命名为myfunctionceshi,然后点击next,在libraries中添加生成的jar包路径,和matlab中的javabuilder.jar路径 在 matlab\toolbox\javabuilder\jar

目录下。

然后编写程序调用jar包中的函数function1,失败错误:

Exception in thread "main" java.lang.UnsatisfiedLinkError: Failed to find the library libmwmclmcrrt.so.7.17, required by MATLAB Builder JA, on java.library.path.

 This library is typically installed along with MATLAB or the MCR, its absence may indicate an issue with that installation or the current path configuration.

The MCR version that this component is trying to use is: 7.17。

在网上搜寻解决办法后发现这个问题的原因可能是mcr没有安装或者调用出错导致的,首先安装matlab中的mcr(在生成jar包时添加mcr的那个页面双击mcrinstall就能安装),然后运行,继续报错,本人的计算机系统是64位操作系统,所以安装的matlab2012a也是64位的,我将jdk版本升级为1.6.0_31(64位),然后重新配置环境变量,重新生成jar包。重新建立java工程调用后不再报此错误。

在调用函数成功后发现原本的matlab程序希望传入的参数是数组参数,而测试时只能传入单个参数,在网上搜寻发现java传参数给matlabjar包需要特别的语句MWNumericArray)。

最后调试完成的java代码为

import com.mathworks.toolbox.javabuilder.*;

import function1.*;

/*

 * MJBuilderTest class test the function1 class created by Java Builder. The

 * inputs are passed on the command line.

 */

publicclass function1ceshi {

    publicstaticvoid main(String[] args) {

       Object[] result = null; /* Stores the result */

       function1 myfunction = null; /* Stores function1 class instance */

       try {

           myfunction = new function1();

           double[] dbx = {8,15,48,142,456};

           MWNumericArray  x = new MWNumericArray(dbx,MWClassID.DOUBLE);

           result = myfunction.function1(1, x);

           System.out.println(result[0]);

       } catch (Exception e) {

           System.out.println("Exception: " + e.toString());

       }

    }

}

Dbx为传入的参数

 

第二篇: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(); //从控制台输入第一个操作数Syst

em.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输入第二个操作数: 22The sum of 55 and 22 is: 77The sub of 55 and 22 is: 33The mul of 55 and 22 is: 1210The div of 55 and 22 is: 3四、 错误调试1. 安装matlab不完整,没有toolbox\javabuilder下的文件2. 环境变量中classpath中添加两个jar文件的路径