参考链接:https://wenku.baidu.com/view/defcdc33eff9aef8951e0605.html
方法一:Java调用matlab代码实现混合编程,目前网上大多数博客都是将matlab中的函数打包成一个jar包,之后将生成的jar包添加到项目中并在Java中导入,但如果想对matlab中的函数进行修改,就需要重新打包jar包,这种方式无疑是比较麻烦的。一种好的解决方法是在Java中直接调用matlab软件完成计算返回结果,这种方法不需要在matlab代码改动之后重新生成jar包,用起来相对来说比较简单。
方法二:Java直接调用matlab软件所需组件:matlabcontrol.jar,,,下载地址:https://download.csdn.net/download/qq_38497266/11261383,,,本次实验所用版本为matlabControl-3.1.0,所用matlab为2016a。
matlabcontrol依赖于java matlab interface(JMI),在matlab外用Java调用matlab通过java RMI实现。
具体实现步骤为:
- 创建RemoteMatlabProxyFactory工厂:RemoteMatlabProxyFactory factory = new RemoteMatlabProxyFactory("D:\\Program Files\\MATLAB\\R2016a\\bin\\matlab.exe");参数为matlab应用程序的路径;
- 获得代理:RemoteMatlabProxy proxy = factory.getProxy(600000); 参数可以指定,也可以不指定,默认情况下等待接收MatlabInternalProxy的默认毫秒数为60000;
- 获取代理之后就可通过调用代理的方法与matlab进行交互;
- 交互完成之后,proxy.exit()断开与matlab的连接。
代理的几种方法
返回类型
方法
void
eval(String command):在matlab里执行命令
void
exit():退出matlab
void
feval(String functionName, Object[] args):调用matlab的functionName函数,并传参
String
getIdentifier():返回代理的唯一标识符
Object
getVariable(String variableName):获得matlab里名为variableName变量的值
setVariable(String variableName, Object variableValue):例如setVariable("a", 5),给变量a赋值为5
Boolean
isConnected():代理是否连接到matlab
Object
returningEval(String command, int returnCount):在matlab里执行命令并返回结果
Object
returningFeval(String functionName, Object[] args):调用matlab的functionName函数,并传参,获取object类型的返回值
Object
returningFeval(String functionName, Object[] args, int returnCount)
用Java调用matlab的具体实例,如下面代码:
1、首先创建一个简单的matlab函数,实现两个数相加:
2、Java中创建一个项目,将matlab里创建的sumOne.m文件放到该项目路径中,再new>>Folder,命名为lib,将matlabcontrol-3.1.0添加进来,并右键选择Build Path>>Add to Build Path,src目录下新建一个class调用刚才创建的sumOne函数:
package noJar;
import java.rmi.Remote;
import matlabcontrol.*;
public class test {
public static void main(String[] args) throws MatlabConnectionException, MatlabInvocationException {
RemoteMatlabProxyFactory factory = new RemoteMatlabProxyFactory("D:\\Program Files\\MATLAB\\R2016a\\bin\\matlab.exe");//创建工厂
RemoteMatlabProxy proxy = factory.getProxy(600000); //获取代理,并且指定连接matlab的最大时间为600000ms
int[] x ={1,2,3,4,5,6,7,8,9};
int[] y={9,8,7,6,5,4,3,2,1};
Object[] input = {x,y};
Object result = proxy.returningFeval("sumOne", input);//调用sumOne.m函数,传入input参数,
// System.out.println(result);
//把result[OBJECT类型]转化成int数组
int[] tranfer=(int[])result;
for (int i = 0; i < tranfer.length; i++) {
System.out.println(tranfer[i]);
}
proxy.exit();//断开与matlab的连接
System.exit(0);
}
}
程序最终运行的结果: