Java程序调用MATLAB接口

Java程序调用MATLAB接口,第1张

Java程序调用MATLAB接口 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.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 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 列的数据

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5703477.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存