Java程序调用MATLAB接口

文章目录

  • Java程序调用MATLAB接口
    • 一、注意事项
    • 二、环境安装
    • 三、MATLAB如何生成JAR包
    • 四、MATLAB生成的JAR包如何引入到Java程序中
    • 五、Java程序如何调用MATLAB生成的JAR包
    • 六、关于MATLAB参数相关问题解答

一、注意事项

1、 MatLab的版本必须是2006b+(包括2006b或更高版本),因为只有在这些版本中才有MATLAB Builder for Java(也叫Java Builder)

2、验证系统JDK JRE,系统首先装有Java环境。 验证JDK JRE版本位数。打开cmd 输入命令 【java -version】

和 【javac -version】分别验证编译和运行版本。如图所示:

以上问题如果不一致的解决方案:

验证系统jdk jre,系统首先装有Java环境(不在叙述)。 验证jdk,jre版本位数。打开cmd 输入命令 【java -version】 和 【javac -version】分别验证编译和运行版本。也许有读者会想,两个命令查看的结果肯定版本都一样,但是有些情况java和javac的版本还真不一样,比如安装了多个版本的jdk或者不同位数的jdk,如果是以安装的方式安装,那么java版本和位数是以最后一次安装保持一致,因为安装时,会把java.exe拷贝到系统目录一份(例如:win8中的c:/windows/system32)。虽然配置了java环境变量,但是如果java环境变量配置在了path变量值得最后方,由于系统目录配置在了最前方,以前方为准。因此会出现配置无效。照成了以上所说的情况,这种情况解决方法有两种(1:删除系统目录下的相关java文件,2:把java环境变量配置到Path的最前面)。

3、运行机器上必须装有JRE 并且版本要和MatLab自带的JRE 大版本保持一致(位数也要保持一致)(大版本一致既可,比如同是1.7,或者1.8既可)

查看MatLab 自带JRE版本位数方法:在MatLab中Command Windows中输入 【version -java】 命令查看。如图所示:

4、调用MATLAB所需环境必须安装有MATLAB或者安装对应版本的MATLAB Compiler Runtime (MCR):附地址

MCR对应版本下载地址:https://ww2.mathworks.cn/products/compiler/matlab-runtime.html

5、如果你用的是AMD的处理器,不是intel的处理器,安装matlab后,可能不能运行,具体表现是,一打开就关闭了。解决办法其实也很简单,就是给你的 机器新建立一个系统变量,变量名是BLAS_VERSION,变量值是D://MATLAB7//bin//win32 //atlas_Athlon.dll(你的matlab安装地址)。

二、环境安装

1、Java环境安装此处省略

2、MATLAB安装步骤,参考一下文档:附地址

metlab安装说明:
http://www.xue51.com/soft/31354.htmlmetlab激活说明:
https://jingyan.baidu.com/article/19020a0a69e25e529c284244.htmljava调用metlab实例:
https://www.cnblogs.com/chuanduanbolg/p/9430141.htmlMatlab MCRinstaller.exe Runtime如何安装:
https://jingyan.baidu.com/article/47a29f248dd3acc0142399be.html下载地址:
https://ww2.mathworks.cn/products/compiler/matlab-runtime.htmlMatlab MCRinstaller.exe Runtime产品介绍:
https://ww2.mathworks.cn/products/compiler.html?s_tid=srchtitlemetlab部署注意事项:
https://blog.csdn.net/qq_27731689/article/details/85853936

三、MATLAB如何生成JAR包

1、编写.m文件,如图所示:

2、在命令行窗口输入deploytool,回车后在弹出的框中选择第三个Library Compiler

3、

4、点击Package后会出现如下图两图所示界面,并选择需要输出到的目录,生成的jar包便存在该目录中,当出现三个对号时,则打包完成

四、MATLAB生成的JAR包如何引入到Java程序中

该步骤涉及到两个或两个以上的JAR包,分别为javabuilder.jar和打包生成的jar包

1、根据需求搭建SSM或springboot项目,如下以springboot为例

2、找到MATLAB生成的JAR包,点击打包后会生成一个JAR包,为刚刚打包好的jar包,具体位置在点击Package后选择的目录,目录结构如下图:

3、双击选择上图中的for_redistribution_files_only目录,并进入

4、将生成的jar包复制到桌面,该jar包具体位置如下图:

5、另一个jar包为javabuilder.jar;
将javabuilder.jar复制到桌面;
该jar包具体位置在安装目录下…\toolbox\javabuilder\jar\javabuilder.jar,具体位置如下图:

6、将MATLAB生成的两个jar包(以上两步复制到桌面的jar包)引入到项目中,如何引入第三方JAR包可参考已发表的资料,附地址

https://blog.csdn.net/m0_46487331/article/details/122303910?spm=1001.2014.3001.5501

五、Java程序如何调用MATLAB生成的JAR包

1、调用示例:

     @GetMapping("/calP")public ResultData<? extends Object> calP() {// 返回的数据矩阵Object[] result = null;// 实例CalParamTest calParamTest = null;// 存放值的数组MWNumericArray input = null;try {// 创建调用实例calParamTest = new CalParamTest();// 创建参数矩阵// 创建二维数组double[][] arr = {{1, 0}, {0, 1}};// 将二维数组转化为矩阵input = new MWNumericArray(arr, MWClassID.DOUBLE);// 调用实例方法// 参数1:表示输出多少个矩阵,输入1表示输出一个矩阵// 参数2....:表示输入的矩阵,当需要多个输入矩阵时,可以input1,input2...// 注意,输入参数可以为MWNumericArray对象;基本数据类型的数据可以直接带入,不需要MWNumericArray对象,例如int a = 1;result = calParamTest.calP(1, input);//1、将结果object转换成MWNumericArrayMWNumericArray output = (MWNumericArray) result[0];System.out.println("输出矩阵:" + output);System.out.println("输出矩阵维数:" + output.numberOfElements());System.out.println("输出矩阵元素个数:" + output.numberOfNonZeros());// #######以下为拓展内容:#######// 将输出的多维矩阵转换为一维数组System.out.println("多维矩阵转换为一维数组:" + Arrays.toString(output.getDoubleData()));// 将输出的多维矩阵转换为二维数组System.out.println("多维矩阵转换为二维数组:" + Arrays.deepToString((double[][]) output.toDoubleArray()));// 响应调用结果return new ResultData<>(200, "计算成功", null);} catch (Exception e) {e.printStackTrace();// 服务异常return new ResultData<>(500, "服务异常", null);} finally {// 释放本地资源MWArray.disposeArray(input);if (calParamTest != null) {calParamTest.dispose();}}}

2、调用返回结果格式:仅供参考

输出矩阵280.0000  290.6372  185.0815  155.0000  157.0000220.0000  312.9300  170.0000   85.0000  157.0000188.0000  324.0765  170.0000   50.0000  157.0000190.0000  336.1784  170.0000   12.0000  157.0000400.0000  663.2395  330.4400  150.0000  332.2000550.0000  662.0141  329.7880  155.0000  355.0000
输出矩阵维数:30
输出矩阵元素个数:30

六、关于MATLAB参数相关问题解答

1、目录五示例的入参和出参参数可参考以下资料

调用格式:
Object[] result = null;//用于保存计算结果。//当返回矩阵有n个,则result[0]…result[n-1]分别是这些返回矩阵。result = c1.myFunction(1, intput); //调用matlab函数,第一个数表示输出多少个矩阵,输入1表示输出一个矩阵。//输入2表示有两个输出矩阵,以此类推。输出多少个矩阵根据原先m文件的定义。//input表示输入的矩阵,当需要多个输入矩阵时,可以input1,input2…调用matlab函数时,int型数据可以直接带入:
Example1:
int i=2;
result = c1.myFunction(1,i);
Example2:int[] i={2,3,2,5};result = c1.myFunction(1,i);常规的输入矩阵:
MWNumericArray input = null;//用于保存输入矩阵double array[] = { 3, 2, 4, 5 };//要计算的数//int array[]={3,2,4,5};也是可以的。input =new MWNumericArray(array, MWClassID.DOUBLE);result = c1.myFunction(1, intput);输入二维矩阵:double array[][] ={{3,2,4,5},{2,4,4,5} };//要计算的数,两行四列//int array[][] ={ {3,2,4,5},{2,4,4,5} };也是可以的。//输入三维等多维矩阵同理。input =new MWNumericArray(array, MWClassID.DOUBLE);result = c1.myFunction(1,intput);输出的Object[]处理
Object数组有多少元素由输出矩阵数决定Object转换成MWNumericArrayExample:MWNumericArray output = null;//用于保存输出矩阵output = (MWNumericArray)result[0];//将结果object转换成MWNumericArraydouble res = output.getDouble(1);//从MWNumericArray对象中读取数据后期处理,释放本地资源
MWArray.disposeArray(input);//建立的矩阵用这句MWArray.disposeArray(output);//建立的矩阵用这句MWArray.disposeArray(result);//建立的Object数组用这句c1.dispose();//建立的matlab类对象用这句以上释放时,必须保证其不为null。MWNumericArray常用方法介绍
clone():Object
复制矩阵,返回的是Object类型,需要强制转换成MWNumericArray。如:MWNumericArray other = (MWNumericArray)one.clone();getDouble():double
以double的格式获取矩阵的第一个数,常用于只有一个数的矩阵getDouble(int i):double
以double的格式获取矩阵中的第i个数getDouble(int[]i):double
若i两个元素数组,则以double的格式获取矩阵中的i[0]行,i[1]列的数。多维矩阵同理,i的维数要与该矩阵的维数一致,否则出错。getDoubleData():double[]
返回一个一维double的数组,对于多维矩阵按列的顺序连接成数组。如:,返回的数组为1,3,2,4。其他getByte、getInt、getShort、getLong、getFloat同理
注意:低字节的数据类型会强制转换,导致精度丢失。set(int i,double in):void将矩阵中第i个数设置成in。以下同理:set(int i,byte in):voidset(int i,short in):voidset(int i,int in):voidset(int i,long in):voidset(int i,float in):voidset(int[]i,double in):void
若i两个元素数组,则设置矩阵中的i[0]行,i[1]列的数为in。以下同理:set(int[] i,byte in):voidset(int[] i,short in):voidset(int[] i,int in):voidset(int[] i,long in):voidset(int[] i,float in):voidtoDoubleArray():Object
将矩阵以Object返回,实为多维double数组返回,需要强制转换成为多维数组。维数由原来矩阵确定。若为二维数组,则double[][] dou = (double[][])one.toDoubleArray();以下同理:toByteArray():ObjecttoShortArray():ObjecttoIntArray():ObjecttoLongArray():ObjecttoFloatArray():ObjectMWNumericArray父类MWArray常用方法
disposeArray(Objecto):void
静态方法,释放矩阵的本地资源。classID():MWClassID返回矩阵类型,如double。getDimensions():int[]
返回int数组,数组大小与矩阵维数相同,依次表示各维大小(如行数、列数)。isEmpty():boolean
若是空矩阵返回true,否则返回false。isSparse():boolean
若是稀疏矩阵返回true,否则返回false。numberOfDimensions():int
返回矩阵维数。numberOfElements():int
返回矩阵元素个数。numberOfNonZeros():int
返回非零元素个数。

2、MATLAB中如何获取到Java程序传递的矩阵参数

在matlab中,取出矩阵中某一个值的方法如下:
1、对于二维数组:
a(i, j) % 表示取出二维数组a的第 i 行,第 j 列的数据
a(:, j) % 表示取出二维数组a的第 j 列的所有数据
a(i, :) % 表示取出二维数组a的第 i 行的所有数据2、多维数组的方法与二维数组类似(以三维数组为例):
b(i, j, k) % 表示取出三维数组a的第k个二维数组的第 i 行,第 j 列的数据
b(:, j, k) % 表示取出三维数组a的第k个二维数组的第 j 列的所有数据
b(i, :, k) % 表示取出三维数组a的第k个二维数组的第 i 行的所有数据
b(i, j, :) % 表示取出三维数组a的每个二维数组的第 i 行,第 j 列的数据

3、在matlab中 出现1.0e+003 *是什么意思?

意思是1*10^3,它是科学计数法的表示方式。
举两个例子:
如果您输入了向量[23 000 000, 55 000 000],那么MATLAB会将之表示为:1.0e+7*[2.3, 5.5]
如果您输入了向量[0.000 000 23, 0.000 000 55],那么MATLAB会将之表示为:1.0e-7*[2.3, 5.5]

Java程序调用MATLAB接口相关推荐

  1. java 采集rtsp_通过Java程序调用RTSP拉流协议视频平台EasyNVR程序接口步骤概览

    RTSP协议视频平台EasyNVR经过多年的积累,已经是一套成熟且完善的视频平台了,用户可以通过网页直接访问视频监控,也可以通过调用二次开发接口进行二次开发或者集成.下面介绍下Java程序调用Easy ...

  2. java调用easyxml接口_【技术教程】如何通过Java程序调用RTSP拉流协议视频平台EasyNVR程序接口?...

    原标题:[技术教程]如何通过Java程序调用RTSP拉流协议视频平台EasyNVR程序接口? RTSP协议视频平台EasyNVR经过多年的积累,已经是一套成熟且完善的视频平台了,用户可以通过网页直接访 ...

  3. java中调用matlab程序及相关问题

    **在java中调用matlab程序,首先要将matlab程序打包成jar文件,才可以被java程序所调用. 打包时本人所用的各种工具: 1:myeclipse-bule 2:java-1.7 3:m ...

  4. java如何接入实时流_【技术教程】如何通过Java程序调用RTSP拉流协议视频平台EasyNVR程序接口?...

    RTSP协议视频平台EasyNVR经过多年的积累,已经是一套成熟且完善的视频平台了,用户可以通过网页直接访问视频监控,也可以通过调用二次开发接口进行二次开发或者集成.下面介绍下Java程序调用Easy ...

  5. C++中调用MatLab接口等

    C++ 与 Matlab协作使用比较复杂,逐步学习积累记录,侧重于在C++程序中调用MatLab接口. 环境 Ubuntu 20.04 VS Code Matlab R2021a for Linux ...

  6. java cxf 调用wcf接口_JAVA 调用 WCF 服务流程

    1.  将 WCF 服务发布到 Windows 服务(或者 IIS) 此步骤的目的是为 WCF 服务搭建服务器,从而使服务相关的 Web Services 可以被 JAVA 客户端程序调用,具体步骤参 ...

  7. java程序调用Oracle 存储过程 获取返回值(无返回,非结果集,结果集)

    oracle中procedure是不能有返回值的,要想返回值,就得有输出参数,同样要想返回记录集,可以把游标类型作为输出参数. 下面是详细情况说明: 一:无返回值的存储过程调用 存储过程: creat ...

  8. 微信小程序调用支付接口支付(tp5、小程序)

    微信小程序调用支付接口支付 今天记录一下学习的小程序调用微信支付接口 一.先理清一下调起微信支付的整个流程. 1.就是先调用微信的支付统一下单api获取到prepay_id 2.然后后端再将这个pre ...

  9. java程序调用百度Geocoding API逆地址解析通过经纬度查询位置

    自从百度升级了自己的逆地址解析调用接口,就多了一些调用限制,具体参数可以参照百度给出的解释.本文主要研究通过java代码调用该接口: 下面给出调用接口的方法: public static String ...

最新文章

  1. js模块化编程之CommonJS和AMD/CMD
  2. 14.Python抠图脚本
  3. python 图标字体_Icon-font图标字体的四类制作方法
  4. @ModelAttribute运用详解
  5. x-lite for linux,Linux Lite 4.6正式发布:现基于Ubuntu 18.04.3 LTS
  6. 将字符串编码成 GBK
  7. 【Java】异常处理体系概述
  8. 学python可以做什么职业-学了Python,就能拿下这 7 个高薪的未来职业
  9. dns代表计算机哪个术语,windows dns 术语解释
  10. 【数据仓库与OLAP技术】期末复习+考题
  11. 完美mix-in(混入)模式———js对象想怎么玩就怎么玩
  12. 微信群发助手 及微信助手功能
  13. 国内与国际控制学科知名会议
  14. 字符串中大小写转换输出
  15. 前后端分离校园智能出行拼车系统
  16. 图扑入选 2021 中国企业抗洪捐赠 500 强榜单
  17. e431装linux系统恢复,联想E431笔记本CentOS系统安装无线网卡驱动
  18. 手机影像二十载,AI多摄会是终极答案吗?
  19. N o v e m b e r 2 7 t h T u e s d a y
  20. catia在装配体中编辑零件_CATIA-V5-在装配体中新建零件并插入

热门文章

  1. vmos框架_vmos魔改共存版自带roor框架下载-vmos魔改版去广告去更新v1.0.63极简版_新绿资源网...
  2. FMEA案例丨新版PFMEA失效分析怎么做?
  3. emu8086:如何实现数组的倒置
  4. 自创小说《彩虹雨》 连载(四)
  5. IDC机房维护的三个方面
  6. 2021最后一次Java面试,java工程师职业生涯规划
  7. Java 第九次平时作业
  8. 息屏指纹解锁性能优化 TP LCD
  9. WPF优化DrawingContext.DrawLine
  10. Linux 版本的百度云盘来了!!!