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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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" ng.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.
*/
public class function1ceshi {
public static void 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为传入的参数。

相关文档
最新文档