您的位置:首页 > 编程语言 > MATLAB

Java调用Matlab程序

2017-01-23 00:00 393 查看
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包。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java MATLAB API