Java调用Matlab函数

准备工作

总体上来讲,就是将Matlab程序打包成jar包供Java程序调用。
首先要安装Matlab和JDK,其中要保证Matlab支持的java版本跟你电脑上安装的java版本保持一致。Matlab查看支持的Java版本,使用version -java命令
Java调用Matlab函数
Java查看本地电脑安装版本号是通过windows的命令行窗口中使用java -version命令查看
Java调用Matlab函数
如上图,两个版本号一致Matlab才可以生成jar包
我之前使用的1.8版本的Java,与2014a的matlab版本支持的java版本不符,只好重新安装成1.7版本的java版本。
注意:Matlab**不完全也会导致出错Matlab**不完全

生成jar包

在matlab中使用创建函数

function c=Demo(a,b)
c=a+b;
end

命令行调用验证成功
Java调用Matlab函数
2、 在MATLAB的Command Window输入deploytool命令
选择library Compiler
Java调用Matlab函数
接下来按图中表示操作
Java调用Matlab函数
在setting中可用查看生成文件的目录
Java调用Matlab函数
等待一分钟左右生成文件
注意使用for_testing目录下的jar包

  • for_redistribution包含用于安装应用程序和MATLAB Runtime的文件。
  • for_testing文件夹包含创建的所有由MCC创建的文件,像二进制文件和jar,头和源文件,使用这些文件来测试安装。
  • for_redistribution_files_only文件夹包含应用程序的重新发布所需的文件。这些文件可以分发到那些有MATLAB或者有 MATLAB Runtime 的用户的电脑上。
    在新建的java工程中添加刚生成的jar包以及javabuilder.jar包,具体位置可用查看for_redistribution_files_only文件夹下的readme.txt稳定
    Java调用Matlab函数
    之后再Java工程中调用jar包就可以使用了
    Java调用Matlab函数

非矩阵输入非矩阵输出

Matlab中的数据类型与Java中的数据类型不同,必须要转换

在java中调用之前Matlab中生成的jar包就可以调用函数,得到结果

import MatlabProject.test;;

public class Demo {

	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int a =0;
		int b=0;
		
		if(sc.hasNext()){
			a=sc.nextInt();
			b=sc.nextInt();
		}
		
		try{
			test t=new test(); //之前建立的类
			Object[] result=t.Demo(1,a,b);//第一次参数表示输出矩阵数 
			System.out.println(Integer.valueOf(result[0].toString()));
		}catch(Exception e){
			System.out.println(e);
		} 
	}
}

Java调用Matlab函数
注意:调用matlab函数,第一个数表示输出多少个矩阵,输入1表示输出一个矩阵。输入2表示输出两个矩阵,之后才输入参数
通过Integer.valueOf(Object.toString)就可以将Object转换成Java中的int类型函数
而Matlab可以直接识别Java中的int数据类型

矩阵输入矩阵输出

其实可以将矩阵分解成一个个的数然后使用上面介绍的方法调用Matlab函数,但有时矩阵太大,调用不方便,就得使用MWNumericArray类了。
关于这个类的使用可以查看MWNumericArray类使用

还是使用同样的Matlab函数

function c=Demo(a,b)
c=a+b;
end

通过MWNumericArray类进行参数输入
输出结果也是MWNumericArray,通过

MWNumericArray data = (MWNumericArray) result[0];
			double arr[]=data.getDoubleData();

转换成java中的数组
Java原码如下

import MatlabProject.test;
import com.mathworks.toolbox.javabuilder.MWNumericArray; 
import com.mathworks.toolbox.javabuilder.MWClassID;  
public class Demo {

	public static void main(String[] args) {
		
		int array1[] ={1,1,1,1};
		int array2[] ={2,2,2,2};
		//可以更改类型,选择复数矩阵
		MWNumericArray a=new MWNumericArray(array1,MWClassID.INT16);
		MWNumericArray b=new MWNumericArray(array2,MWClassID.INT16);
		
		try{
			test t=new test(); //之前建立的类
			Object[] result=t.Demo(1,a,b);//第一次参数表示输出矩阵数 
			
			MWNumericArray data = (MWNumericArray) result[0];
			double arr[]=data.getDoubleData();
			
			for(int i=0;i<arr.length;i++){
				System.out.println(arr[i]);
			}

		}catch(Exception e){
			System.out.println(e);
		} 
	}
}

结果
Java调用Matlab函数

后记

两天时间才完成了这篇博客,比想象的要累,总算结束了。中间遇到很多之前没有想到的问题,下一次更新博客应该是Swing中的多线程,希望大家能多多关注。