MATLAB+JAVA的混合开发

news2024/11/19 9:36:22

近期项目中需要使用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类型的入参。否则就会报错,参数类型不匹配!!!

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/669927.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenJdk 和 oracleJdk

OpenJDK的网站&#xff08;https://jdk.java.net/&#xff09;通常仅显示最新的几个版本&#xff0c;对于更早的版本&#xff0c;可能不再在主页面上列出。这是因为随着时间的推移&#xff0c;Java社区通常会专注于支持和维护最新的版本&#xff0c;并鼓励开发者尽可能地使用最…

开源软件介绍——国内和国际主要开源社区

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天我们来看一看国内和国际上有哪些主要开源社区。 开源社区的定义 开源社区又称为开放源代码社区&#xff0c;一般由拥有共同兴趣爱好的人组成。根据相应的开源软件许可证协议公布软件源代码的网络平台&a…

【深度学习】5-2 与学习相关的技巧 - 权重的初始值

在神经网络的学习中&#xff0c;权重的初始值特别重要。实际上&#xff0c;设定什么样的权重初始值&#xff0c;经常关系到神经网络的学习能否成功。本节将介绍权重初始值的推荐值&#xff0c;并通过实验确认神经网络的学习是否会快速进行。 可以将权重初始值设为0吗 后面我们…

搜索引擎的个性化搜索:为何搜索结果因人而异

&#x1f482; 个人网站:【海拥】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 目录 前言搜索引擎的工作原理…

uniapp uView2 字体加载错误提示处理(字体离线方案)

最近老是收到有人反馈 uView2的字体图标报错&#xff0c;具体错误提示如下图 这个报错的原因有2种情况 at.licdn.com 网站维护&#xff0c;无法加载&#xff1b;国内这些小程序平台的开发工具日常抽风&#xff0c;代码能跑&#xff0c;但就是报错&#xff0c;简直离谱&#x…

漏洞复现 D-Link DCS 密码泄露漏洞

0x01 漏洞描述 D-link DCS是一款网络摄像机&#xff0c;工作温度为0-50℃。D-link DCS系统存在密码泄露漏洞&#xff0c;攻击者通过漏洞可以获取后台权限。 0x02 漏洞复现 fofa&#xff1a;app“D_Link-DCS-4622” 1.使用poc进行账号密码查看&#xff0c;得到密码登录即可 …

网络安全是什么?怎么学

网络安全基础 安全的定义&#xff1a; 1&#xff09;一种能够识别和消除不安全因素的能力&#xff1b; 2&#xff09;安全是一个持续的过程网络安全是一门涉及计算机科学、网络技术、通信技术、密码技术、信息安全技术、应用数学、数论、信息论等多种学科的综合性科学。 网络…

Redis原理 - 数据结构的底层实现

原文首更地址&#xff0c;阅读效果更佳&#xff01; Redis原理 - 数据结构的底层实现 | CoderMast编程桅杆https://www.codermast.com/database/redis/redis-datastruct-underlying-implementation.html 动态字符串SDS #基本概念 Redis 中保存的 Key 是字符串&#xff0c;V…

C国演义 [第六章]

第六章 最长递增子序列题目理解步骤dp含义递推公式初始化遍历顺序 代码 最长连续递增序列题目理解步骤dp含义递推公式初始化遍历顺序 代码 最长递增子序列 力扣链接 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&am…

什么是http代理504网关超时错误,怎么处理

HTTP代理504网关超时错误是指代理服务器在尝试连接目标服务器时&#xff0c;等待目标服务器响应的时间超过了预设的时间&#xff0c;导致代理服务器无法返回请求结果给客户端&#xff0c;从而出现网关超时。 为什么会遇到http代理504网关超时错误 我们遇到HTTP代理504网关超时…

CSPM项目管理专业人员能力评价证书报考条件与考试形势

2021年10月&#xff0c;中共中央、国务院发布的《国家标准化发展纲要》明确提出构建多层次从业人员培养培训体系&#xff0c;开展专业人才培养培训和国家质量基础设施综合教育。建立健全人才的职业能力评价和激励机制。由中国标准化协会&#xff08;CAS&#xff09;组织开展的项…

【人工智能概论】 Python标准库——dalib(领域自适应)

【人工智能概论】 Python标准库——dalib&#xff08;领域自适应&#xff09; 文章目录 【人工智能概论】 Python标准库——dalib&#xff08;领域自适应&#xff09;一. 领域鉴别器&#xff08;DomainDiscriminator&#xff09;二. 领域对抗损失&#xff08;DomainAdversarial…

【MongoDB】五、MongoDB分片集群的部署

【MongoDB】五、MongoDB分片集群的部署 实验目的实验内容实验步骤环境准备部署 Config server配置Config Server副本集部署Shard部署mongos启动分片功能查看分片信息 实验小结 实验目的 能够通过部署MongoDB分片集群熟悉MongoDB分片集群架构和基本操作&#xff0c;从而解决大数…

调用有道API实现语音翻译(汉译英)

目录 1. 作者介绍2. 相关介绍2.1 API介绍2.2 网易API介绍 3. 实验过程3.1 调用过程3.2 代码获取3.3 完整代码 1. 作者介绍 南旭东&#xff0c;男&#xff0c;西安工程大学电子信息学院&#xff0c;2022级研究生 研究方向&#xff1a;机器视觉与人工智能 电子邮件&#xff1a;1…

win10 搭建vue环境并运行项目

win10 搭建vue环境并运行项目 1、参考链接2、遇到的问题及解决 1、参考链接 https://blog.csdn.net/qq_44959735/article/details/128886550 2、遇到的问题及解决 运行的时候不要再git bash里&#xff0c;要在自带的powershell里&#xff0c;以管理员权限运行。 问题&#xf…

未来5年,生产力的底层逻辑变了,影响所有企业

上周&#xff0c;K哥带领20多位企业家、技术高管参访了阿里钉钉&#xff0c;学习AI大模型如何应用到企业生产经营和组织管理当中&#xff0c;以及企业如何使用新生产力工具实现降本增效。 通过这次参访&#xff0c;我对AI大模型如何驱动企业管理变革有了新的认识&#xff0c;三…

js-排序数组中两个数字之和

给定一个已按照 升序排列 的整数数组 numbers &#xff0c;请你从数组中找出两个数满足相加之和等于目标数 target 。 函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 0 开始计数 &#xff0c;所以答案数组应当满足 0 < answer[0] < answ…

【ArcGIS】栅格重分类(Reclass)

ArcGIS栅格重分类&#xff08;Reclass&#xff09; 1 重分类&#xff08;Relassify&#xff09;1.1 新值替代1.2 将值组合到一起1.3 按相同等级对一组栅格的值进行重分类1.4 将特定值设置为NoData或者为NoData像元设置某个值1.5 操作步骤 2 查找表&#xff08;Lookup&#xff0…

CS5366设计原理图|Type-C转HDMI2.0 4K60+USB3.0+PD3.1视频转换芯片应用电路图

CS5366Type-C转HDMI2.0的显示协议转换芯片, 内部集成了PD3.0及DSC decoder, 并能按客户需求配置成不同的功能组合&#xff0c; 是目前集成度与功耗更小的一颗芯片。 Type-C转HDMI2.0 4K60USB3.0PD3.1视频转换芯片应用电路图&#xff1a; CS5366系列符合USB电源传输规范3.0。CS…

C语言+单片机-内存分布详解,全网最全,值得收藏保存

目录 一、C语言内存分区 1. 代码区 2. 常量区 3. 全局(静态)区 4. 堆区(heap) 5. 栈区(stack) 二、STM32存储器分配 1. 随机存储器—RAM 2. 只读存储器—ROM 三、基于STM32代码验证 1. 详细代码如下 2. 运行结果如下 四、单片机中的内存分布 1.含义解释 2. 程序…