Java如何调用Matlab程序
目录
- Java如何调用Matlab程序
- 1. 检查Matlab内置的Java版本和系统安装的Java版本是否一致?
- 2. 准备一份要调用的Matlab代码
- 3. 将Matlab代码打包成Jar包
- 4. 新建Java项目,调用由Matlab得到的Jar包
- Java调用Matlab函数笔记
- 1.在命令行中输入deploytool
- 2.点击上图中标有红框的部分
- 3.选择javapackage,依次填写name,classname
- 4.编写java类,进行测试
- 5.调用有返回结果的函数
Java如何调用Matlab程序 背景
Matlab可以轻易处理非常复杂的数学计算,Java具有多变的应用场景,如Web开发。本文讲述如何将两者优势结合起来,基本思路是将Matlab核心程序打包成Jar,供普通的Java程序调用。
具体步骤
1. 检查Matlab内置的Java版本和系统安装的Java版本是否一致?
检查MATLAB内置的Java版本
【Java如何调用Matlab程序】
文章图片
检查系统的Java版本
文章图片
2. 准备一份要调用的Matlab代码
为了测试各种数据类型(如Matlab的矩阵数据类型)的使用,本文采用稍稍复杂的Matlab测试程序:基于测距的网络定位。其包含多个M文件,其中主函数代码如下。输入参数7个:gCov是矩阵,其他为标量。输出参数2个,都是矩阵。
function [ nodeLoc, pMds ] = main_localization( N,dim, space, nGps, gCov, sigma, numMiss )nodeLoc = diag(ones(dim,1)*space)*(rand(dim,N)-0.5); dltSec= zeros(N,1); achrIdx = 1:nGps; covMats = zeros(dim,dim,nGps); for n = 1:nGpscovMats(:,:,n) = gCov; end[CT,CR] = round_robin(nodeLoc,dltSec,sigma); [A,~,y] = gen_Ay(CT,CR,ones(N)); connMat = gen_connMat(N,numMiss); dltEst = est_dlt_ls(A,y,connMat); distVec = y-A*dltEst; distMat = diag_vec2mat(distVec); edm = distMat.^2; pGps = mvnrnd(nodeLoc(:,achrIdx)',gCov)'; pMds = classic_mds(edm, dim); pMds = orthogonal_procrustes(pMds, pGps, achrIdx); end
其他多个M文件列表如下图所示:
文章图片
3. 将Matlab代码打包成Jar包
(1) 在Matlab命令行窗口输入deploytool指令,唤起打包部署工具
文章图片
(2) 配置打包类型、包名、类名;选择待打包的M的文件
文章图片
(3) 等待打包完成,应有3个对勾
文章图片
(4) 打包生成的工程目录结构如下
文章图片
4. 新建Java项目,调用由Matlab得到的Jar包
(1) Eclipse新建Java项目(不赘述)
(2) 添加两个Jar包到Java项目中
Matlab安装目录下的Jar包:...\MATLAB\R2017a\toolbox\javabuilder\jar\javabuilder.jar前面M文件生成的Jar包:...\localization_matlab\for_redistribution_files_only\localization_matlab.jar
文章图片
(3) 写Java程序调用Matlab生成的Jar包,源码如下:
package com.csrl.localization; import com.mathworks.toolbox.javabuilder.MWClassID; import com.mathworks.toolbox.javabuilder.MWException; import com.mathworks.toolbox.javabuilder.MWNumericArray; import localization_matlab.MdsLocalization; public class TestLocalization {public static void main(String[] args) {try {MdsLocalization matrixCompletion = new MdsLocalization(); double N = 10; double dim = 2; double space = 500; double sigma = 2; double nGps = 5; double numMiss = 0; double[][] gCovArr = {{1,0},{0,1}}; MWNumericArray gCov = new MWNumericArray(gCovArr,MWClassID.DOUBLE); // 将二维数组转化为矩阵// 第一个参数“2”代表原Matlab函数输出参数的个数,后面的都是原Mat了吧函数输入参数;输出参数用Object数组保存Object[] result = matrixCompletion.main_localization(2, N,dim, space, nGps, gCov, sigma, numMiss); MWNumericArray data = https://www.it610.com/article/(MWNumericArray) result[0]; // 第一个输出参数double[][] nodeLoc = (double[][]) data.toDoubleArray(); // 将矩阵转化为二维数组data = (MWNumericArray) result[1]; // 第二个输出参数double[][] pMds = (double[][]) data.toDoubleArray(); // 将矩阵转化为二维数组System.out.println(result[0]); // 同Matlab输出格式,输出矩阵System.out.println(result[1]); System.out.println(nodeLoc[0][0]); // 通过二维数组索引输出矩阵中某个元素System.out.println(pMds[0][0]); } catch (MWException e) {e.printStackTrace(); }}}
Java调用Matlab函数笔记 笔记是记录通过java如何调用matlab函数:
1.在命令行中输入deploytool
文章图片
2.点击上图中标有红框的部分
3.选择javapackage,依次填写name,classname
文章图片
在package的过程中可能会出现mcc错误的情况
4.编写java类,进行测试
import com.mathworks.toolbox.javabuilder.MWException; import computef.ComputeF; public class matlab2javaTest {public static void main(String args[]) throws MWException {System.out.println( System.getProperty("java.library.path")); ComputeF cl = new ComputeF(); cl.computef(0); }}
第一次运行时,会报如下错误
Exception in thread “main” java.lang.UnsatisfiedLinkError: Failed to find the library mclmcrrt7_14.dll, required by MATLAB Builder JA, on java.library.path.错误原因可能是:path中没有matlab的路径,即找不到mclmcrrt7_14.dll这个文件,添加matlab路径到path中就可以了
This library is typically installed along with MATLAB or the MCR, its absence may indicate an issue with that installation or the current path configuration.
The MCR version that this component is trying to use is: 7.14.
5.调用有返回结果的函数
m文件内容:
function [f,c]=computef(key)
调用computerf函数时
Object[] result = null; result = cl.computef(2,0); //第一个参数是返回结果的个数,第二个参数是实际参数
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 考研英语阅读终极解决方案——阅读理解如何巧拿高分
- 如何寻找情感问答App的分析切入点
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus使用queryWrapper如何实现复杂查询
- 事件代理
- SpringBoot调用公共模块的自定义注解失效的解决
- Java|Java OpenCV图像处理之SIFT角点检测详解
- 如何在Mac中的文件选择框中打开系统隐藏文件夹
- 漫画初学者如何学习漫画背景的透视画法(这篇教程请收藏好了!)