Java程序调用MATLAB接口

Java程序调用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,回车后在弹出的框中选择第三个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转换成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型数据可以直接带入:
Example1int i=2;
result = c1.myFunction(1,i);
Example2int[] 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

ExampleMWNumericArray 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类对象用这句

以上释放时,必须保证其不为nullMWNumericArray常用方法介绍
clone()Object
复制矩阵,返回的是Object类型,需要强制转换成MWNumericArray。

如:MWNumericArray other = (MWNumericArray)one.clone();

getDouble()doubledouble的格式获取矩阵的第一个数,常用于只有一个数的矩阵

getDouble(int i)doubledouble的格式获取矩阵中的第i个数

getDouble(int[]i)double
若i两个元素数组,则以double的格式获取矩阵中的i[0]行,i[1]列的数。多维矩阵同理,i的维数要与该矩阵的维数一致,否则出错。

getDoubleData()double[]
返回一个一维double的数组,对于多维矩阵按列的顺序连接成数组。如:,返回的数组为1324。

其他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


返回矩阵类型,如doublegetDimensions()int[]
返回int数组,数组大小与矩阵维数相同,依次表示各维大小(如行数、列数)。

isEmpty()boolean
若是空矩阵返回true,否则返回falseisSparse()boolean
若是稀疏矩阵返回true,否则返回falsenumberOfDimensions()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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值