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.html metlab激活说明: https://jingyan.baidu.com/article/19020a0a69e25e529c284244.html java调用metlab实例: https://www.cnblogs.com/chuanduanbolg/p/9430141.html Matlab MCRinstaller.exe Runtime如何安装: https://jingyan.baidu.com/article/47a29f248dd3acc0142399be.html 下载地址: https://ww2.mathworks.cn/products/compiler/matlab-runtime.html Matlab MCRinstaller.exe Runtime产品介绍: https://ww2.mathworks.cn/products/compiler.html?s_tid=srchtitle metlab部署注意事项: https://blog.csdn.net/qq_27731689/article/details/85853936三、MATLAB如何生成JAR包
1、编写.m文件,如图所示:
2、在命令行窗口输入deploytool,回车后在d出的框中选择第三个Library Compiler
3、
4、点击Package后会出现如下图两图所示界面,并选择需要输出到的目录,生成的jar包便存在该目录中,当出现三个对号时,则打包完成
四、MATLAB生成的JAR包如何引入到Java程序中1、根据需求搭建SSM或springboot项目,如下以springboot为例
2、找到MATLAB生成的JAR包,点击打包后会生成两个JAR包,一个名为javabuilder.jar,一个为刚刚打包好的jar包,具体位置在点击Package后选择的目录,目录结构如下图:
3、双击选择上图中的for_redistribution_files_only目录,并进入
4、将生成的jar包复制到桌面,该jar包具体位置如下图:
5、将javabuilder.jar复制到桌面,该jar包具体位置在安装目录下…toolboxjavabuilderjarjavabuilder.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转换成MWNumericArray MWNumericArray 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.0000 220.0000 312.9300 170.0000 85.0000 157.0000 188.0000 324.0765 170.0000 50.0000 157.0000 190.0000 336.1784 170.0000 12.0000 157.0000 400.0000 663.2395 330.4400 150.0000 332.2000 550.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转换成MWNumericArray Example: MWNumericArray output = null;//用于保存输出矩阵 output = (MWNumericArray)result[0];//将结果object转换成MWNumericArray double 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):void set(int i,short in):void set(int i,int in):void set(int i,long in):void set(int i,float in):void set(int[]i,double in):void 若i两个元素数组,则设置矩阵中的i[0]行,i[1]列的数为in。 以下同理: set(int[] i,byte in):void set(int[] i,short in):void set(int[] i,int in):void set(int[] i,long in):void set(int[] i,float in):void toDoubleArray():Object 将矩阵以Object返回,实为多维double数组返回,需要强制转换成为多维数组。维数由原来矩阵确定。 若为二维数组,则 double[][] dou = (double[][])one.toDoubleArray(); 以下同理: toByteArray():Object toShortArray():Object toIntArray():Object toLongArray():Object toFloatArray():Object MWNumericArray父类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 列的数据
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)