Java如何调用Matlab程序

 更新时间:2021年09月06日 11:52:30   作者:Macrocell  
这篇文章主要介绍了Java如何调用Matlab程序的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Java如何调用Matlab程序

背景

Matlab可以轻易处理非常复杂的数学计算,Java具有多变的应用场景,如Web开发。本文讲述如何将两者优势结合起来,基本思路是将Matlab核心程序打包成Jar,供普通的Java程序调用。

具体步骤

1. 检查Matlab内置的Java版本和系统安装的Java版本是否一致?

检查MATLAB内置的Java版本

在这里插入图片描述

检查系统的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:nGps
        covMats(:,:,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 = (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.
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.

错误原因可能是:path中没有matlab的路径,即找不到mclmcrrt7_14.dll这个文件,添加matlab路径到path中就可以了

5.调用有返回结果的函数

m文件内容:

function [f,c]=computef(key) 

调用computerf函数时

Object[] result = null;
result = cl.computef(2,0);//第一个参数是返回结果的个数,第二个参数是实际参数

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringMVC 传日期参数到后台的实例讲解

    SpringMVC 传日期参数到后台的实例讲解

    下面小编就为大家分享一篇SpringMVC 传日期参数到后台的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • Java使用Kaptcha实现简单的验证码生成器

    Java使用Kaptcha实现简单的验证码生成器

    这篇文章主要为大家详细介绍了Java如何使用Kaptcha实现简单的验证码生成器,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考下
    2024-02-02
  • 常见的排序算法,一篇就够了

    常见的排序算法,一篇就够了

    这篇文章主要介绍了一些常用排序算法整理,插入排序算法、直接插入排序、希尔排序、选择排序、冒泡排序等排序,需要的朋友可以参考下
    2021-07-07
  • maven下mybatis-plus和pagehelp冲突问题的解决方法

    maven下mybatis-plus和pagehelp冲突问题的解决方法

    这篇文章主要介绍了maven下mybatis-plus和pagehelp冲突的解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • Java 轮询锁使用时遇到问题解决方案

    Java 轮询锁使用时遇到问题解决方案

    这篇文章主要介绍了Java 轮询锁使用时遇到问题解决方案,当我们遇到死锁之后,除了可以手动重启程序解决之外,还可以考虑使用顺序锁和轮询锁,但是过程也会遇到一些问题,接下来我们一起进入下面文章了解解决方案,需要的小伙伴可以参考一下
    2022-05-05
  • Mapstruct对象插入数据库某个字段总是为空的bug详解

    Mapstruct对象插入数据库某个字段总是为空的bug详解

    这篇文章主要为大家介绍了在一次需求开发Mapstruct中对象插入数据库某个字段总是为空的bug问题详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • SpringBoot获取配置文件的简单实现方法

    SpringBoot获取配置文件的简单实现方法

    这篇文章主要给大家介绍了关于SpringBoot如何获取配置文件的简单实现方法,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring Boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-05-05
  • java环境变量配置和adb的配置教程详解

    java环境变量配置和adb的配置教程详解

    这篇文章主要介绍了java环境变量配置和adb的配置教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • Java的HashTable源码解读

    Java的HashTable源码解读

    这篇文章主要介绍了Java的HashTable源码解读,HashTable继承了Dictionary类,提供了一些字典相关的基本功能如添加、删除、判空、获取元素数量等,需要的朋友可以参考下
    2023-12-12
  • Java设计模式以虹猫蓝兔的故事讲解桥接模式

    Java设计模式以虹猫蓝兔的故事讲解桥接模式

    桥接是用于把抽象化与实现化解耦,使二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响
    2022-04-04

最新评论