Java调用Matlab函数
Java调用Matlab函数
准备工作
总体上来讲,就是将Matlab程序打包成jar包供Java程序调用。
首先要安装Matlab和JDK,其中要保证Matlab支持的java版本跟你电脑上安装的java版本保持一致。Matlab查看支持的Java版本,使用version -java命令
Java查看本地电脑安装版本号是通过windows的命令行窗口中使用java -version命令查看
如上图,两个版本号一致Matlab才可以生成jar包
我之前使用的1.8版本的Java,与2014a的matlab版本支持的java版本不符,只好重新安装成1.7版本的java版本。
注意:Matlab**不完全也会导致出错Matlab**不完全
生成jar包
在matlab中使用创建函数
function c=Demo(a,b)
c=a+b;
end
命令行调用验证成功
2、 在MATLAB的Command Window输入deploytool命令
选择library Compiler
接下来按图中表示操作
在setting中可用查看生成文件的目录
等待一分钟左右生成文件
注意使用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工程中调用jar包就可以使用了
非矩阵输入非矩阵输出
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);
}
}
}
注意:调用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);
}
}
}
结果
后记
两天时间才完成了这篇博客,比想象的要累,总算结束了。中间遇到很多之前没有想到的问题,下一次更新博客应该是Swing中的多线程,希望大家能多多关注。