许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  Java调用Matlab函数及多版本JDK同时配置方法

Java调用Matlab函数及多版本JDK同时配置方法

阅读数 5
点赞 0
article_banner

一、 环境配置  

1.查看matlab中 jdk  版本:

>> version -java

ans =

Java 1.7.0_11-b21 with Oracle Corporation Java HotSpot(TM) 64-Bit Server VM mixed mode

2.配置系统jdk为上述版本!(不一致会导致下面编译出错)

正常我是用的jdk1.8,但是不需要卸载,到Oracle仓库下载好对应jdk1.7.0u11版本安装,安装完将原有的Java环境变量配置稍微改动一下即可:

CLASSPATH:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar

# 有几个jdk就配几个变量,比如我的机器上有3个版本的jdk
JAVA_HOME_MATLAB:https://www.gofarlic.com\Program Files\Java\jdk1.7.0_11

JAVA_HOME7:https://www.gofarlic.com\Program Files\Java\jdk1.7.0_80

JAVA_HOME8:https://www.gofarlic.com\Program Files\Java\jdk1.8.0_101

JAVA_HOME:%JAVA_HOME_MATLAB%\

上述根据不同学习需求可以直接更改最后一行的JAVA_HOME的变量的值即可,当前我是使用的是第一步中的jdk版本,并且命名为JAVA_HOME_MATLAB(见名知意吧)

3.环境验证

做完上述工作后,打开系统DOS窗口,运行

java -version

查看是否更改成功,我每次更改基本会有5到10秒的延迟才会生效,所以配置完可以等一会再看;

   除此之外,matlab中默认载入启动时的jdk版本,所以务必重启matlab之后再次运行:

version -java

才能配置成功!!一定要重启!系统jdk才能和matlab中的版本匹配!

   【注意】今天莫名奇妙遇到一个问题,在安装完32位的JDK( 中文 官网下载),死活无法切换,就连其他版本的也无法切换了,原因在与环境变量优先级的问题,在安装完中文网上下载的JDK,它自动给我配置了一个PATH变量:C:\ProgramData\Oracle\Java\javapath,这是这货惹的麻烦,只要将这个变量删除即可,外文管网下载的JDK没有这个毛病, 解决

二、函数打包

matlab中随意写个函数,下面是偷的其他人的函数:

function [ sum,sub,mul,div ] = operation( a, b)
sum = a + b;
sub = a - b;
mul = a * b;
div = a / b;
end

写完保存,命令行运行

deploytool

这里写图片描述

   选择第二个Library Compiler,进入界面后,选择Java Package并选择需要打包的函数.m文件,我这里是operation函数,其他的什么包名、类名

   你们随便取(尽量能看得懂),这里不作具体说明,填好后点击右上角的Package选项,即可。如下:
这里写图片描述

   然后就可以得到jar包,如下:
这里写图片描述
如果出错,你应该这样:请将第一步中环境配置工作反复进行,直到你第二步成功!!

三、Java调用

导入两个jar包,一个就是上述的jar包,还有一个是MATLAB\R2014b\toolbox\javabuilder\jar路径下的javabuilder.jar包,java调用如下,由于本次函数中的数据类型比较简单,普通的int类型即可,复杂数据类型请自行百度两者类型的对应关系,测试代码:

import com.mathworks.toolbox.javabuilder.MWException;
import operation.Class1;

/**
 * created by WeiguoLiu on 2017/12/27
 */
public class MatlabTest {
    public static void main(String[] args) throws MWException {
        int a = 9;
        int b = 3;
        Object[] result = null;
        //都怪我,这个类名和方法名起的太搓了……
        Class1 class1 = new Class1();
        //虽然Matlab中只有2个输入量,但是查看生成的源码发现需要对结果对象的大小进行初始化
        // 这里表示有4个返回值数量总共有4个
        result = class1.operation(4,a,b);
        for(Object o:result) {
            System.out.println(o.toString());
        }
    }
}

源码:

//4的由来,大小初始化
    public Object[] operation(int var1, Object... var2) throws MWException {
        Object[] var3 = new Object[var1];
        this.fMCR.invoke(Arrays.asList(var3), MWMCR.getRhsCompat(var2, sOperationSignature), sOperationSignature);
        return var3;
    }

注意:

   BP神经网络案例:由于在Matlab中变量多以行向量或者列向量或者矩阵的形式输入,上述的只是简单int类型无法满足我的需要,在Java中通常可以定义一维或者二维数组的形式作为变量输入,但是在实际过程中,发现只能以行向量的形式作为输入,类似于这样:

Double[][] inputs2 = new Double[][]{{0.0, 20.6, 14.4, 42.8, 46.5, 19.6}};

如果定义成列向量,会抛出输入参数过多的异常,如下:

Double[][] inputs = new Double[][]{
        {0.0},
        {20.6},
        {14.4},
        {42.8},
        {46.5},
        {19.6},
};

最终在花费了巨额时间找到如下的解决方案,在定义好的数组上套一个封装即可解决,这一步一定不能掉!!:

//将此参数作为输入列向量传入即可
MWNumericArray array = new MWNumericArray(inputs);

下面是Matlab中模式识别案例–螃蟹识别的Java调用的完整代码见:
https://github.com/Jacksonary/CodeRepository/tree/master/MatlabTest


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删


相关文章
技术文档
QR Code
微信扫一扫,欢迎咨询~
customer

online

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

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空