许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  【Java调用MATLAB】完整教程

【Java调用MATLAB】完整教程

阅读数 3
点赞 0
article_banner

前言

最近遇到个变态需求,使用系统数据通过matlab绘图,并将图片上传系统。作为一个java程序员对于matlab了解的实在少,于是就上网寻找答案,但是找到的东西都不够全面,所以决定自己记录一下这个过程。

系统环境说明

这点对于java调用matlab来说至关重要,如果出现差别就可能会使得调用不成功

  • 开发环境
运行环境版本操作系统类型
jdk1.8.0.131windows x64
matlabR2017bwindows x64

这里matlab自带jdk的版本是1.8.0.121与开发 windows  系统的版本相近,开发环境java调用matlab库会直接调用安装的matlab环境,不会调用MCR(matlab运行时环境)

  • 部署环境
运行环境版本操作系统类型
jdk1.8.0.191centos x64
matlab MCRR2017bcentos x64

线上部署一般使用的是 linux  服务器,没有图形化界面,因此一般安装运行时环境及MCR,当程序代码移植到服务器就需要去调用MCR环境->下载地址

开发(windows下)

  • matlab安装(R2017b)

        matlab安装就不介绍了,可自行百度
  • 接口设计

        接口设计也是比较重要的一环,决定java端传什么样的参数给matlab的程序,可传的参数有单个数值,字符串,矩阵等。

带参数返回值

function [ data ] imageCreate(name,time,data,storePath)

这里data是返回值,可以是矩阵,可以是值;name,time,data,storePath是参数,如name可以传string,time可以传double,data可以传矩阵,这都取决于你的matlab程序如何处理这些参数

不带参数返回值

function imageCreate()
  • matlab代码实现

        通过你出色的matlab造诣写一段matlab的代码,然后在本地编译看能不能通过,测试通过后进行下一步
  • 生成jar包

        在matlab命令行窗口输入 depoytool
    在这里插入图片描述

        选择Library Compiler
    在这里插入图片描述

        根据提示生成java jar包
    在这里插入图片描述

还有需要注意的一点是,如果你的matlab程序依赖的别的包,在打成jar时需要将这些依赖打包进去
在这里插入图片描述

  • java代码实现

        首先需要将matlab生成的jar导入到java工程,这里以mvn导入方式为例导入jar

        1 、首先在工程目录resources目录下新建lib目录
    在这里插入图片描述

        2、将matlib javabuilder.jar以及刚才打包好的imageCreate.jar移动到lib目录下

        javabuilder.jar 的路径在matlab安装路径:
    https://www.gofarlic.com\Program Files\MATLAB\R2017b\toolbox\javabuilder\jar

        imageCreate.jar 可以在你生成jar时选择的路径找到

        3、mvn配置

        使用system标签将刚才的jar引入,里面的groupId,artifactId,version可自定义进行标识
        <!-- matlab绘图导出jar -->
        <dependency>
            <groupId>com.spaceon</groupId>
            <artifactId>matlab-infocard</artifactId>
            <version>1.0</version>
            <scope>system</scope>
            <systemPath>${pom.basedir}/src/main/resources/lib/imageCreate.jar</systemPath>
        </dependency>
        <!-- matlab javabuilder-->
        <dependency>
            <groupId>com.spaceon</groupId>
            <artifactId>matlab-jb</artifactId>
            <version>1.0</version>
            <scope>system</scope>
            <systemPath>${pom.basedir}/src/main/resources/lib/javabuilder.jar</systemPath>
        </dependency>
package com.face;

import imageCreate.ImageCreate;
import com.mathworks.toolbox.javabuilder.MWClassID;
import com.mathworks.toolbox.javabuilder.MWException;
import com.mathworks.toolbox.javabuilder.MWNumericArray;

/**
 * @author baixuezhi
 * @date 2022/7/1
 */
public class Test {
    public static void main(String[] args) throws MWException {

        ImageCreate ic = new ImageCreate();
        String[][] arr = {{"20220601000203","-3.775923","82.507018","27.9"},
                {"20220601010203","-3.784745","82.516632","28.1"},
                {"20220601020203","-3.791435","82.528632","28.5"},
                {"20220601030203","-3.798773","83.540260","29.1"},
                {"20220601040203","-3.807707","83.546432","29.5"},
                {"20220601050203","-3.817848","84.550345","30.2"},
                {"20220601060203","-3.827710","84.551833","30.5"},
                {"20220601070203","-3.840060","85.551552","31.2"},
                {"20220601080203","-3.853607","85.553405","31.5"},
                {"20220601090203","-3.868455","85.558052","32.3"},
                {"20220601100203","-3.881727","86.561080","32.5"},
                {"20220601110203","-3.893028","86.563507","33.5"},
                {"20220601120203","-3.904352","86.566032","34.5"},
                {"20220601140203","-3.904352","87.566032","34.8"}
        };
        //转矩阵
        MWNumericArray matArr = new MWNumericArray(arr, MWClassID.DOUBLE);
        String name= "AMAX121212";
        String time="20220601";
        String path = "C:\\Users\\lenovo\\Desktop\\xxx\\图片\\";
        //生成图片并保存到指定路径
        ic.argosInfoCard(name, s, matArr,path);
    }
}
  • 打包

        在项目pom文件plugins标签加入以下配置
<includeSystemScope>true</includeSystemScope>

例:

            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <mainClass>com.face.webapi.WebApplication</mainClass>
                    <includeSystemScope>true</includeSystemScope>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>build-info</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

部署(linux下)

  • centos 服务器 MCR 安装(R2017b) 将下载下来的安装包上传到服务器并解压 在安装目录新建matlab文件夹进行操作 mkdir matlab mv MCR_R2017b_glnxa64_installer.zip matlab cd matlab unzip MCR_R2017b_glnxa64_installer.zip 一键获取完整项目代码bash1234 解压的结果:安装 ./install -mode silent -agreeToLicense yes 一键获取完整项目代码bash1 安装完成末尾有两种重要提示信息如上图: 1、给matlab mcr 配置环境变量 vim /etc/profile 一键获取完整项目代码bash1 末尾追加 export LD_LIBRARY_PATH=/usr/local/MATLAB/MATLAB_Runtime/v93/runtime/glnxa64:/usr/local/MATLAB/MATLAB_Runtime/v93/bin/glnxa64:/usr/local/MATLAB/MATLAB_Runtime/v93/sys/os/glnxa64: 一键获取完整项目代码bash1 使配置生效 source /etc/profile 一键获取完整项目代码bash1 2、安装成功的提示
  • 将打包的程序上传centos服务器 将java项目打包上传到刚才安装了MCR的服务器
  • 运行测试 验证服务是否可以正常运行

遇到的问题

  • Spring boot出现java.awt.HeadlessException 这是在开发的时候windows下报的错,在主类添加如下配置即可 static { System.setProperty("java.awt.headless","false"); } 一键获取完整项目代码java运行123
  • Exception in thread “AWT-EventQueue-0” java.lang.NoClassDefFoundError: Could not initialize class com.mathworks.common.icons.IconEnumerationUtils 这个错误比较恶心,我找了好久才找到,问题是matlab运行时common.jar包的依赖与项目中的依赖发生冲突导致,解决有3种方式: 1、修改common.jar的源码, 2、解决java项目中的冲突(不好找出冲突的地方), 3、将项目中该模块独立出来单独部署
  • 还有个问题是,将java打包后上传到服务器,运行的时候报找不到x86(32位)的matlab动态库,让后一直找不到MWMCR类 这个问题的原因是我的开发环境用的是64位的jdk,但是生产环境用的是32位的jdk,尽管版本完全一直但是就会出现以上错误,导致调用失败,之后将服务器的jdk换成64位的就可以了
  • 将程序移植到linux后图片中的字符(matlab代码)显示不出来,感觉像乱码,但又不像 这个问题是应为linux系统下没有对应的字体导致的,我的matlab程序代码中的字体为“微软雅黑”,所以在linux下安装对应字体即可参照网址
    免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删
相关文章
技术文档
QR Code
微信扫一扫,欢迎咨询~
customer

online

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 board-phone 155-2731-8020
close1
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空