相比java等语言,MATLAB在矩阵计算等方面可太强大了。要是java能直接调MATLAB就好了。
确实可以!机缘巧合之下,发现了这个思路,折腾了好几天。
(有些不足的就是其调用开销比较大,目前还不知道如何合理的调用,)
后面了解到,一个处理方法是,先将matlab转为C,再转为Java,这样可以避免java在每次调用函数时需要与Matlab环境进行通讯导致效率低下的问题。(也许不能算通讯,数据交换?)——2022/03/20
MATLAB 编译
脚本编写
编写一个MATLAB函数脚本,这里我以绘图函数为例。
% 自定义画图函数drawplot.m
% 以两个1*n的矩阵为x,y坐标绘制一段线
% 参数 x y
function drawplot(x, y)
plot(x, y, 'r'); %%使用matlab函数plot()作图
xlabel('X轴')
ylabel('Y轴')
end
另外还有一个drawplot2Line.m
用于输出两条线(红+蓝)
打包
-
在MATLAB命令行窗口输入
deploytool
,打开部署工具
-
选择
Library Compiler
-
添加脚本并配置
- 选择导出类型(我选择Java Package)
- 选择要转换的脚本文件(可导入多个)
- 导出的包名
- 在jar包中要生成的类以及类内方法(类名可自定义)
- 是否一起打包MATLAB运行环境MCR(默认不打包,自行从网上下载)
- 打包
-
等待打包完成
-
生成的共有三个文件夹,其中包含导出的jar包和javadoc文档
- for_redistribution
- for_redistribution_files_only
- for_testing
(三者有什么区别我也没有理解透,只要知道取出其中的包导入到java工程中就好)
Java调用
需要将上述方法导出的jar包以及MATLAB安装目录下的\toolbox\javabuilder\jar\javabuilder.jar
包一同导入到Java工程中。Java导入本地jar包我这里就不讲了。
对于矩阵数据,需要使用javabuilder.jar
中提供的MWNumericArray
进行传参。
输入
传递给MATLAB函数时,基本类型可以直接带入,矩阵需要使用MWNumericArray
常规的矩阵输入方式:
MWNumericArray input = null; // 用于保存输入矩阵
//方式一:
input = MWNumbericArray.newInstance(int, int[], MWClassID.DOUBLE, MWComplexity.REAL);
//参数1表示矩阵的维数,参数2表示各维的大小即几行几列,参数三表示数据类型,参数四表示实数或复数
//方式二:
double array[] = {
3, 2, 4, 5 };//要计算的数
//int array[]={3,2,4,5};也是可以的。
input = new MWNumericArray(array, MWClassID.</