Java代码中通过matlabcontrol调用matlab函数,实现混合编程

参考链接: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实现。

具体实现步骤为:

  1. 创建RemoteMatlabProxyFactory工厂:RemoteMatlabProxyFactory factory = new RemoteMatlabProxyFactory("D:\\Program Files\\MATLAB\\R2016a\\bin\\matlab.exe");参数为matlab应用程序的路径;
  2. 获得代理:RemoteMatlabProxy proxy = factory.getProxy(600000); 参数可以指定,也可以不指定,默认情况下等待接收MatlabInternalProxy的默认毫秒数为60000;
  3. 获取代理之后就可通过调用代理的方法与matlab进行交互;
  4. 交互完成之后,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);
	}
}

程序最终运行的结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值