MATLAB与Java实现简单的交互以及矩阵基本处理MATLAB通过⽣成jar包与Java实现简单的交互
⾸先我⽤的⼀些⼯具:
MATLAB 2014 a
MyEclipse 2013
相应的的破解包matlab学好了有什么用
JDK 1.7
MATLAB与Java交互原因(个⼈认为)
MATLAB是⼀种常见的数学软件,⽽使⽤Java的过程对⼀些的数据处理可能没有那么轻松,但通过MATLAB确可以⽐较轻松的解决。这个时候如果可以将MATLAB与Java结合,那么许多难题就可以迎刃⽽解。
MATLAB破解
jar包⽣成
作为初学者,我是通过在MATLAB⾥⽣成jar包,在Java中调⽤这个jar包⾥的⽅法实现交互的,所以能不能⽣成jar包这⼀点⾄关重要,这也是为什么我在上⾯提到了要完全破解,并把破解包放上去的原因,不过还是要感谢⽹上那些⼤佬告诉了我们这些,分享了破解资源,我只是⼀个搬运⼯希望可以帮助到⼤家。⾸先我们需要在MATLAB⾥写⼀个函数作为调⽤,⽐如下图这样的最基本的函数代码,记住新建这个.m⽂件时我们选择新建的是函数,⽽不是新建脚本,新建脚本能不能⽣成jar我不知道,但是我在命令窗⼝想调⽤函数时没成功,可能是因为我菜吧,反正我最后是新建的函数,虽然说脚本也是.m⽂件。
接下来我们就要进⾏jar包⽣成了,在命令窗⼝中输⼊deploytool,然后选择第⼆个Libary Complier,然
后如下图位置选择Java Package,再点击旁边⽅框边上的+号,然后选择到我们刚才创建的这个.m⽂件,改好类名和⽅法。
我的配置如下图,之后点击Package就开始⽣成jar包了:
⽣成完成之后如下图:
我们需要的导⼊进MyEclipse中的jar包是在第⼆个⽂件中。接下来就是最激动的要回归到Java中实现它了。⾸先我们要在MATLAB的安装⽬录下到javabuilder.jar,它是在你安装⽬录下的toolbox⽂件夹下javabuilder⽬录下的jar⽂件夹⾥,⽐如我这个jar包的路径就是
D:\Matlab\toolbox\javabuilder\jar\javabuilder.jar,在我们接下来要测试这个jar包的⼯程中导⼊这个jar包和我们之前⽣成的jar包。测试这个jar包代码如下:
这是最简单的⼀个程序,⾸先我们会发现这是⼀个try~catch的形式,因为有可能会报MWException的错误,因为可能移植到没有matlab 环境或者没有装对应MCR或者动态链接库等运⾏必要东西的时候以及你⾃⼰matlab程序写的有问题时会报错,所以这个try~catch是必要的,没有的话会直接程序报错,具体原因可能需要再探究探究,我上⾯只是根据实际遇到的情况推测的。在新建好类之后我们应该怎么做
呢,这个时候就要看for_testing⽂件下这个类的java⽂件了,打开我们可以看到如下的信息:
这正是我们在matlab写的程序调⽤它的⽅法,返回的类型是Obeject[] 也正是写的那个 Object[] result,那后⾯传参呢?
int nargout是什么,我们可以看到注释的解释,指的就是MATLAB函数中对应的输出参数个数,所以输出的⼀个不定⼤⼩的⼆维矩阵这个参数也是1,⽽且nargout在印象⾥好像也是MATLAB⾥⾯的输出宗量。后⾯开始就是你对应MATLAB函数的传⼊参数了,也正是测试代码的两个传参,所以程序的输出结果是2,关于之前提到的MWException,注释⾥也提及到了。如果运⾏时出现什么不到main什么的弹出错误,请检查下JDK,⼀开始我⽤的1.6运⾏就报错了,换成对应的1.7就好了,更换JDK,去buildPath⾥⾯可以更换。
这是最基本的⼀个测试代码,但是我们⼀般⽤到的肯定不会是这样简单的。很有可能会涉及到矩阵输出,遇到输出是矩阵的时候我们再打印result[0]的话,会发现⼀次性全打印出来了,⽐如[{1,2},{3,4}]会⼀次性将这些元素全部打印,我们如果需要对每个元素进⾏处理或者操作的话,显然⽬前这样是不够的,这个时候你可以⽤个debug调试看到,这种情况下的result[0]的数据类型是MWNumbericArray,所以通过查看API或者上⽹查这个对应的类的⽅法就可以进⾏相应处理了,这⾥给出⼀个处理⽅法:
package test;
import lbox.javabuilder.MWException;
import tryArray.FirstTest;
public class Test {
public static void main (String[] args) {
try {
FirstTest test = new FirstTest();
Object[] result = stTry(1, 1);
System.out.println(result[0]);
} catch (MWException e) {
e.printStackTrace();
}
}}
MWNumbericArray data = (MWNumbericArray ) result[0];
double[][] resultData = (double[][]) data .toDOubleArray;
这样就将它转换成了对应的double类型数组,接下来就可以对其中元素实现操作了。那怎么进⾏反向转换进⾏传参呢?其实我试过直接将double类型作为参数传进去,没有问题,就是对应成为了MATLAB中的矩阵好像,如果觉得这样不靠谱,反向转换如下:
double[][] dou = {{1,2,3},{4,5,6}};
MWNumericArray input = new MWNumericArray(dou,MWClassID.DOUBLE);
总结
第⼀次写博客,也是菜鸟,错误的地⽅请指出⼤家共同进步。看⽂档API,真的很重要,这些⽅法的作⽤,怎么⽤都写好了。即使说明是英⽂的,但是其实⽤法写的也是很清楚。这也从侧⾯看到其实学好英语还是很重要的,然⽽我英语很差,看的很吃⼒很难受。对了,我当时移植到没有MATLAB电脑上会出现报错,在电脑上安装MATLAB提供的MATLAB Compiler Runtime(MCR)解决了,路径是MAT
LAB安装路径下的toolbox\compiler\deploy\。安装好,重启电脑问题解决。如果需要⽤很早的JDK⽐如1.6,可以考虑MATLAB2011a,不过破解完记得把时间拨⼀下,因为2017年破解就到期了,更改系统时间即可使⽤。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论