MATLAB+JAVA的混合开发

2023-11-20

近期项目中需要使用matlab跟java做混合开发。主要记录一下,此次开发遇到的问题点。

环境:使用的matlab版本是   R2018b。

当前状况:MATLAB代码已经编写好,且运行成功。需要打成jar包才可以被java调用。

步骤一:

按照教程安装好matlab后,打开matlab,查看当前matlab依赖的jdk版本号:

找到对应的java版本,安装到本机,并配置对应的环境变量。

然后开始打包:

 点击package后勾选需要保存打包好的文件路径

点击保存后开始打包,                                          打包成功后界面

 打开输出文件夹,会出现4个文件夹

 可以看到最后的jar包名称与上文中输入的一致。这就是我们需要在java中调用的jar。

将该jar包引入到java项目中,榆次同时还需要将MATLAB中的另一个jar也引入java项目,否则调用不成功。在本机的MATLAB阿德安装目录中找到javabuilder.jar一同引入。

至此,MATLAB工程就可以被java程序调用了。

步骤二:

在java项目中引入MATLAB编译好的jar包

 在java项目中编写对应代码调用jar,由于我的MATLAB程序输出的是两个参数,因此需要将两个数据分别获取到 ,然后合并到同一个文件中,保存下来后,与在MATLAB中执行后对比,确认运行成功。

import com.mathworks.toolbox.javabuilder.*;
import testhalo.TestHalo;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class halotest {
    public static void main(String[] args) {
        MWNumericArray input = null;
        Object[] result = null;
        TestHalo test = null;
        try {
            input = new MWNumericArray(Double.valueOf(15),MWClassID.DOUBLE);
            test = new TestHalo();
//这里注意  第一个参数  是MATLAB程序会输出几个返回值    从第二个参数向后 才是真正调用MATLAB的jar的入参
            result = test.testhalo(2,2023d,6d,15d,19d,10d,0d,1d,8000d,60d);
            saveArrayToFile("E:\\1\\2\\1.txt",result);
        } catch (MWException e) {
            e.printStackTrace();
        } finally {
            MWArray.disposeArray(input);
            MWArray.disposeArray(result);
            test.dispose();
        }
    }

// 保存数值数组到文件
    private static void saveArrayToFile(String filename, Object[] response) {
        try {
            BufferedWriter writer = new BufferedWriter(new FileWriter(filename));
            MWNumericArray T = (MWNumericArray) response[0];	// 第一个输出参数   
            MWNumericArray Halo = (MWNumericArray) response[1];				// 第二个输出参数 
            int[] haloDimensions = Halo.getDimensions();
            int[] TDimensions = T.getDimensions();
            if (haloDimensions.length != TDimensions.length || haloDimensions[0] != TDimensions[0])
                return;
            int numRows = haloDimensions[0];  //行数
            int haloCols = haloDimensions[1];  //列数
            int tCols = TDimensions[1];

            for (int i = 1; i <= numRows; i++) {
                for (int j = 1; j <= haloCols; j++) {
                    int[] index = {i,j};
                    double valueHalo = Halo.getDouble(index);
                    writer.write( Double.toString(valueHalo));
                    if (j <= haloCols) {
                        writer.write("\t");
                    }
                }
                for (int k = 1; k <= tCols; k++) {
                    int[] index = {i,k};
                    double valueT = T.getDouble(index);
                    writer.write( Double.toString(valueT));
                    if (k <= haloCols) {
                        writer.write("\t");
                    }
                }
                writer.newLine();
            }
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

遇到的问题总结: 

 1.只能接受具有单个入口点的MATLAB函数和MEX文件作为导出函数

当勾选完需要作为主程序入口的文件时会弹窗报错。这是因为勾选的文件有多个程序入口,需要将这些调用方法都拆分到其他文件中,保证这个文件中只有一个主程序调用入口。

2.调用入参传递问题

这行代码是调用MATLAB的jar的入口。可以看到引入的jar包,然后实例化后调用我们在上文中指定的修改后的主程序方法名(根据你自己定义的方法名修改),然后后面的入参,有一点要注意:第一个入参,不是真正的入参,是定义MATLAB的jar的实际返回的数据有几个。从第二个参数开始,才是真正的调用testhalo()的入参。

 3.导入java程序后调用报错

这是因为MATLAB中程序被编译成jar包后,涉及到数据格式转换。在java中编写程序调用MATLAB的jar时,需要使用double类型的入参。否则就会报错,参数类型不匹配!!!

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MATLAB+JAVA的混合开发 的相关文章

随机推荐

  • 代码点(code point)和代码单元(code units)

    1 解释一 char Java中 char类型为16个二进制位 原本用于表示一个字符 但后来发现 16位已经不够表示所有的字符 所以后来发展出了代码点表示字符的方法 代码点 code point 是指编码字符集中 字符所对应的数字 有效范围
  • 题目94:时间函数,一个猜数游戏,判断一个人反应快慢。

    import time import random play input 请问你想玩1 100猜字游戏吗 yes no n while play yes number random randint 1 100 guess int input
  • 148.排序链表(java)

    148 排序链表 题目描述 在 O n log n 时间复杂度和常数级空间复杂度下 对链表进行排序 示例 1 输入 4 gt 2 gt 1 gt 3 输出 1 gt 2 gt 3 gt 4 示例 2 输入 1 gt 5 gt 3 gt 4
  • oracle数据库 data not found的问题

    工作中写pkg的时候 遇到了这个问题 原因是在 select into的时候 可能会出现查出来是空值的情况 这个时候就会报错 解决方法是用count 先判断有没有数据 再根据有没有数据来决定要不要进行查询并赋值
  • LeetCode 面试16.18 模式匹配

    你有两个字符串 即pattern和value pattern字符串由字母 a 和 b 组成 用于描述字符串中的模式 例如 字符串 catcatgocatgo 匹配模式 aabab 其中 cat 是 a go 是 b 该字符串也匹配像 a a
  • Vue项目分包打包配置(包含dev)全过程

    今天领导要求支援某项目的分包配置 emmm 在参考了公司其他项目的分包操作后 依葫芦画瓢 中间也踩了好几个坑 简单记录下过程 一 拉代码 安装依赖 哈哈哈 上来就踩坑了 我拉了代码后 直接哐哐整 然后一堆依赖报错 我才发现 同事新增了依赖包
  • yyyy-MM-dd‘T‘HH:mm:ssZ的T是什么意思?为什么要用单引号引着

    背景 Java里的日期格式 通常我们看到 yyyy MM dd T HH mm ssZ 的写法是什么意思 尤其这个T作为分隔符为什么左右有单引号 这个单引号会打印出来吗 这个Z又是什么意思 是时区吗 如果是时区 输出的格式是什么 是类似于这
  • java上传图片、文件和富文本内容到服务器上,查看和删除文件

    1 上传富文本内容 前端的富文本内容传到后端 将富文本内容拼接成html页面代码 将内容转换成html文件上传到服务器指定位置进行存储 String profile data xiangmu linux服务器上项目文档存放目录 String
  • python导入excel模块_Python利用Psycopg2模块将Excel表格数据导入Postgressql

    import os import numpy as np import pandas as pd import xlrd import psycopg2 import redis conn redis Redis host localhos
  • python利用bs4获取网络小说

    所选定的小说网址 https www shicimingju com book xiyouji html 如果想更换其他小说资源 在上一级网址就行 https www shicimingju com book 代码如下 from bs4 i
  • jeecgboot问题解决方案

    常见问题Q A JEECG老版在线文档 点击进入 1 后台访问提示token错误 报错截图 解决方案 JeecgBoot后台的所有请求访问 增加了token机制 所以不能直接访问后台 而需要通过前台登录才能访问 默认前台访问地址 http
  • 探查Weblogic JDBC Multipool 问题

    问题描述 WebLogic Server MultiPool 有两种不同的类型 高可用性 MultiPool 和负载平衡 MultiPool 这两种算法互不相容 分别用于达成不同的目标 本模式提供有关这两种算法的信息 了解不同类型的 Web
  • 5.sklearn之转换器(划分训练集和测试集、以及标准化、归一化数据会用transform,独热编码也会用到)

    文章目录 1 什么是转换器 2 测试集和训练集 2 1 训练集 测试集 验证集 2 2 拆分训练集测试集有个问题 2 3 代码 3 标准化 3 1 上离差标准化代码 举一反三就好了 其他几个用法一样 3 2 sklearn 其他标准化函数
  • SDL检查

    SDL检查 在用 Visual Studio 编译比较早的代码时 经常会遇到错误 错误 C4996 wcscpy This function or variable may be unsafe Consider using wcscpy s
  • Python+selenium+pytest 自动化测试环境搭建

    Python Selenium Pytest 自动化测试环境搭建 一 安装Python及解释器 二 安装浏览器及对应浏览器驱动 1 安装谷歌浏览器 浏览器安装之后 关闭浏览器的自动更新 因为如果浏览器自动更新了 你的浏览器驱动没有更新 那么
  • Web渗透入侵流程思路

    什么是web渗透入侵呢 渗透测试能够独立地检查你的网络策略 换句话说 就是给你的系统安了一双眼睛 而且 进行这类测试的 都是寻找网络系统安全漏洞的专业人士 下面就来一起学习分享一下web入侵渗透流程中的思路 首先献出一张宝贵的图 这张图上写
  • Fiddler 教程

    Fiddler是最强大最好用的Web调试工具之一 它能记录所有客户端和服务器的http和https请求 允许你监视 设置断点 甚至修改输入输出数据 使用Fiddler无论对开发还是测试来说 都有很大的帮助 阅读目录 Fiddler的基本介绍
  • 异常:java.lang.ArrayIndexOutOfBoundsException

    java lang ArrayIndexOutOfBoundsException 一种运行时异常 常出现在数组下标越界中 称为下标出界异常 代码演示 下面异常报错 就是因为我的数组arr只能有arr 0 arr 1 两个元素 而我的循环中多
  • 番茄钟工作法:你真的了解番茄钟么?

    1 什么是番茄工作法 番茄工作法的发明者 意大利人弗朗西斯科 西里洛于1992年创立了番茄工作法 他和我们大多数人一样 是一个重度拖延症患者 他在大学生活的头几年 曾一度苦于学习效率低下 于是他做了个简单的实验 我就不信我不能专注10分钟
  • MATLAB+JAVA的混合开发

    近期项目中需要使用matlab跟java做混合开发 主要记录一下 此次开发遇到的问题点 环境 使用的matlab版本是 R2018b 当前状况 MATLAB代码已经编写好 且运行成功 需要打成jar包才可以被java调用 步骤一 按照教程安