MATLAB与Java实现简单的交互以及矩阵基本处理

MATLAB通过生成jar包与Java实现简单的交互

首先我用的一些工具:

  • MATLAB 2014 a
  • MyEclipse 2013
  • 相应的的破解包
  • JDK 1.7

MATLAB与Java交互原因(个人认为)

MATLAB是一种常见的数学软件,而使用Java的过程对一些的数据处理可能没有那么轻松,但通过MATLAB确可以比较轻松的解决。这个时候如果可以将MATLAB与Java结合,那么许多难题就可以迎刃而解。

MATLAB破解

在网上找到对应的破解包,接下来开始对之前的MATLAB进行破解,破解步骤网上不细说了,但是因为要能生成所以MATLAB2014 a这个版本需要进行完全破解的,而网上破解的一般只是让libmwservices.dll进行替换,这样的话,在进行生成jar包的时候会报错,原因就是没有完全破解,除了替换他之外,我们还需要要将mcc.exe和compiler.dll进行替换,具体的破解包如果你们没找到的话,这里附上网盘链接:链接:https://pan.baidu.com/s/1PV8sJZfhqjAIAt8t8xJ4TA 密码:4xwt 。具体操作什么的,网上教程太多了,不细说了,毕竟不是重点。

jar包生成

作为初学者,我是通过在MATLAB里生成jar包,在Java中调用这个jar包里的方法实现交互的,所以能不能生成jar包这一点至关重要,这也是为什么我在上面提到了要完全破解,并把破解包放上去的原因,不过还是要感谢网上那些大佬告诉了我们这些,分享了破解资源,我只是一个搬运工希望可以帮助到大家。首先我们需要在MATLAB里写一个函数作为调用,比如下图这样的最基本的函数代码,记住新建这个.m文件时我们选择新建的是函数,而不是新建脚本,新建脚本能不能生成jar我不知道,但是我在命令窗口想调用函数时没成功,可能是因为我菜吧,反正我最后是新建的函数,虽然说脚本也是.m文件。
MATLAB与Java实现简单的交互以及矩阵基本处理_第1张图片
接下来我们就要进行jar包生成了,在命令窗口中输入deploytool,然后选择第二个Libary Complier,然后如下图位置选择Java Package,再点击旁边方框边上的+号,然后选择到我们刚才创建的这个.m文件,改好类名和方法。
MATLAB与Java实现简单的交互以及矩阵基本处理_第2张图片

我的配置如下图,之后点击Package就开始生成jar包了:
MATLAB与Java实现简单的交互以及矩阵基本处理_第3张图片
生成完成之后如下图:
MATLAB与Java实现简单的交互以及矩阵基本处理_第4张图片
我们需要的导入进MyEclipse中的jar包是在第二个文件中。接下来就是最激动的要回归到Java中实现它了。首先我们要在MATLAB的安装目录下找到javabuilder.jar,它是在你安装目录下的toolbox文件夹下javabuilder目录下的jar文件夹里,比如我这个jar包的路径就是D:\Matlab\toolbox\javabuilder\jar\javabuilder.jar,在我们接下来要测试这个jar包的工程中导入这个jar包和我们之前生成的jar包。测试这个jar包代码如下:

package test;

import com.mathworks.toolbox.javabuilder.MWException;
import tryArray.FirstTest;

public class Test {

    public static void main(String[] args) {
        try {
           FirstTest test = new FirstTest();
           Object[] result = test.testTry(1, 1);
           System.out.println(result[0]);
        } catch (MWException e) {
            e.printStackTrace();
        }
    }

}

这是最简单的一个程序,首先我们会发现这是一个try~catch的形式,因为有可能会报MWException的错误,因为可能移植到没有matlab环境或者没有装对应MCR或者动态链接库等运行必要东西的时候以及你自己matlab程序写的有问题时会报错,所以这个try~catch是必要的,没有的话会直接程序报错,具体原因可能需要再探究探究,我上面只是根据实际遇到的情况推测的。在新建好类之后我们应该怎么做呢,这个时候就要看for_testing文件下这个类的java文件了,打开我们可以看到如下的信息:
MATLAB与Java实现简单的交互以及矩阵基本处理_第5张图片
这正是我们在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或者上网查找这个对应的类的方法就可以进行相应处理了,这里给出一个处理方法:

    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)解决了,路径是MATLAB安装路径下的toolbox\compiler\deploy\win64\MCRInstaller.exe。安装好,重启电脑问题解决。如果需要用很早的JDK比如1.6,可以考虑MATLAB2011a,不过破解完记得把时间拨一下,因为2017年破解就到期了,更改系统时间即可使用。

你可能感兴趣的:(Java)