java调用Matlab程序解决问题实际上比较少见,因为
- 每进行一次计算就要启动一个matlab实例,导致程序运行缓慢
- 部署服务器时需要安装matlab运行环境,占据服务器空间
实际上有需要计算可以通过调用特定的jar包来实现,但如果找不到对应的jar包,必须使用Matlab来编写函数实现的话,就有必要了解一下java调用Matlab函数的过程。
下面就介绍一下java调用Matlab的过程(我使用的是MATLAB R2016a版本):
1、编写matlab程序并输出成jar
编写好m文件后找到应用程序下的应用程序部署-->Libraray Complier
选择Java Package
选择编写好的.m文件
在下方的Class Name位置可以自己设定输出的类名
选择Runtime downloaded from web(选择这一项的话如果你的OS上没有matlab runtime environment,会自动从网上下载)-->点击Package
选择路径后会出现
成功以后在输出的文件夹中的for_redistribution_files_only文件夹下就可以找到目标jar包
2、在java中引入上一步输入的jar和javabuilder.jar,前者用于调用上一步编写的matlab函数,后者用于调用matlab的API,以实现向matlab程序传值
引入jar包,其中javabuilder.jar可以在Matlab\toolbox\javabuilder\jar里找到
java调用matlab函数,参数一般需要以矩阵的形式传输,使用的类为javabuilder.MWNumericArray,下面是一个矩阵的例子:
//new int[]{11,2}代表矩阵为11行2列的矩阵//MWClassID.DOUBLE代表矩阵中数为double类型,MWComplexity.REAL代表矩阵中是实数MWNumericArray f = MWNumericArray.newInstance (new int[]{11,2}, MWClassID.DOUBLE, MWComplexity.REAL);
然后对矩阵进行赋值,给矩阵赋值有三种方式:
/*方式一:通过set(int id,int value)方法进行赋值,矩阵编号为一列一列数 例如第一行第一列编号为1,第一行第二列的编号为行数+1*/f.set(1,8);f.set(12,1);/*方式二:通过set(int[] id,int value)方法进行赋值,id[]用一个数组代表value所在位置,例如{1,2}代表第一行第二列*/f.set(new int[]{1,2},5};/*方式三:通过setMatrix(MWNumericArray m,int[] value)方法进行赋值,注意传入的数组按列数! 先排完第一列的值,再接着排第二列的值*/f = setMatrix(f,new double[]{80,15,0,28,0,30,0,23,0,0,0});
根据之前设定的类名创建函数对象,并且创建数组用于接收返回值
//创建求解对象MinCost minCostCal = new MinCost();//用于接收返回值Object[] result = null;
调用函数定义的方法,注意根据编写的函数指定返回值的个数,然后依次输入在matlab中定义的函数的参数列表,例如:
//调用求解方法,第一个参数3代表3个返回值result = minCostCal.minCost(3,f,a,b,aeq,beq,staNum,busNum);
最后对result数组进行处理即可。
最后说明一次,如果想把程序部署到服务器上,matlab是一个很糟糕的选择,应该尽量寻找可用的开源jar包。