Java与MATLAB:跨语言调用方法

cut-off

0 前言

直接打成jar包调用是最简单的方式,也可以通过mvn install方式加入本地maven仓库中进行依赖添加。

1 查看MATLAB的jdk版本与本机安装jdk版本

首先应该查看当前MATLAB版本的jdk,要保证MATLAB中的jdk版本与我们本机安装的jdk版本对应。打开MATLAB(我使用的版本是2021a),在命令行窗口输入指令version -java后回车:

查看MATLAB中的JDK版本

只需要保证我们本机的jdk版本也为1.8(小版本不需要一样),而jdk8也应该是使用最多的版本,我本机的jdk就是1.8版本。

win+r 输入cmd进入命令行窗口后输入java -version查看。

查看本地安装的JDK版本

Windows系统JDK8安装

2 MATLAB打包

新建一个测试函数,功能为计算两个数的和

function outputArg1 = myCal(inputArg1, inputArg2)
	outputArg1  = inputArg1 + inputArg2;
end

编写测试函数

在MATLAB命令行窗口输入deploytool,选择Library Compiler

deploytool命令后选择Library Compiler

进入打包界面后设置打包类型、添加类、方法、设置类名等

打包具体操作

可以包含多个类,比如我又写了一个函数myCal2.m,功能为计算两数的差,一个Class中可以包含多个方法,如图所示。

多个类的例子

点击Package后就会进行打包,选择存储的路径就可以了

打包成功的界面

打包好的文件目录如下

打包后生成的文件夹

其中第一个文件夹中有MyAppInstaller_web.exe,这是该程序运行的环境,因为我们是在本机进行打包测试,因此这个运行环境实际上我们是不需要安装的。第二个文件夹中包含我们打好的jar包

打好的jar文件

当然,如果是别人写好的matlab函数打包好了给我们调用,那我们可以安装这个运行环境,但还有一种方法是根据对方打包使用的matlab版本,我们自己去官网下载matlab的运行环境(MCR),在该网站https://ww2.mathworks.cn/products/compiler/matlab-runtime.html 可以看到每个运行环境都有

MATLAB运行环境安装

3 Java调用MATLAB

打开IDEA,我们先新建一个Java的项目,在不使用构建工具Maven时,我们使用add Library的方式加入我们打好的jar包和java调用matlab所必须的jar包javabuilder.jar(这个包存放在matlab目录下,或者matlab运行环境MCR下)

我的javabuilder.jar在路径C:\Program Files\Polyspace\R2021a\toolbox\javabuilder下,大家可以自己查询一下matlab安装的目录。如果调用方没有安装MATLAB,按照第2节说的安装打包好的第一个文件夹中的MCR或者自己在官网下载对应版本均可找到javabuilder.jar文件。我的电脑上也安装了其他版本的MCR(2019a),其中java’builder.jar就存放于D:\MCR2\v95\toolbox\javabuilder\jar中。

罗嗦了这么多,如下图新建一个libs文件夹,添加好了jar包后就可以进行下面的操作了

add as library

我们可以看到,在导入后,我们就可以新建我们之前创建的MyCalClass类并且调用其中的方法了。

断点调试后发现是没问题的,注意myCal()方法中,我使用的是第二个重载方法,即第一个参数为输出的个数,其他参数为可变参数,因为之前写的这个函数实现的是两数相加的功能,得到的结果是一个数,因此输入的第一个参数应当填写1。得到的输出结果是object[]数组形式,可以自己处理为自己所需要的形式,不过使用一些方法就可以将其转化为double数组的形式,因为大家在使用的时候可能得到的输出往往不是一个常数,如以下处理方式就可以将object数组转为double的数组:

MWNumericArray output = (MWNumericArray) objects[i];
double[] doubleData = output.getDoubleData();

com.mathworks.toolbox.javabuilder中还具有很多方法,大家之后可以自行尝试,matlab与java的数据类型是要对应的,我在使用的过程中都是定义java的类型为double,可以正确调用,如果是1n的数据输入可以用一维数组对应,如果输入是mn(包括m*1)维,就需要用到java的二维数组了。

public class testJava {
    public static void main(String[] args) throws MWException {
        MyCalClass myCalClass = new MyCalClass();
        Object[] objects = myCalClass.myCal(1, 2, 3);
        for (int i = 0; i < objects.length; i++) {
            MWNumericArray output = (MWNumericArray) objects[i];
            double[] doubleData = output.getDoubleData();
            for (double doubleDatum : doubleData) {
                System.out.println(doubleDatum);
            }
        }
        System.out.println("调用成功了");
    }
}

到这里基本的调用流程我们已经熟悉了,在实际的工作中我们也可以使用Maven进行操作,具体的使用还是与上面一样的,要做的只是把所需要的这两个jar包导入到maven本地仓库中(mvn install),在pom.xml中引入依赖就可以了。

Maven下载配置

4 多个函数的情况

上述只是单个情况的打包,如果你的程序中不止由一个函数组成,则在打包时需要提前将它们存在一个.m文件中,比如test函数的输入经过了cal函数处理。

多个函数的情况

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空