Java调用MATLAB程序

0 前言

最近有用Java调用MATLAB函数的需求,因此进行了简单的使用,如果有说的不明白的地方还望海涵。

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版本

2 MATLAB打包

新建一个测试函数,功能为计算两个数的和
在这里插入图片描述
在MATLAB命令行窗口输入deploytool,选择Library Compiler
在这里插入图片描述
进入打包界面后设置打包类型、添加类、方法、设置类名等
在这里插入图片描述
可以包含多个类,比如我又写了一个函数myCal2.m,功能为计算两数的差,一个Class中可以包含多个方法,如图所示。
在这里插入图片描述
点击Package后就会进行打包,选择存储的路径就可以了
在这里插入图片描述
打包好的文件目录如下
在这里插入图片描述

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

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

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包后就可以进行下面的操作了在这里插入图片描述
我们可以看到,在导入后,我们就可以新建我们之前创建的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中引入依赖就可以了。

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值