vs2019调用matlab2021混合编程

news2024/11/15 9:24:55

vs2019调用matlab2021

调试程序时使用vs我只能输出去看最后的结果,想实时的观察输出,老师说可以用这个办法去做

主要思想

首先:进行环境配置,主要是两个方面

1. 在VS中配置MATLAB 目录:

(a)找到matlab的安装路径(我的没有装在c盘)
“E:\yanjiusheng\matlab\anzhuanglujing\extern\include”
在这里插入图片描述
添加到包含目录
在这里插入图片描述
(b).在库目录中添加“E:\yanjiusheng\matlab\anzhuanglujing\extern\lib\win64\microsoft”,操作系统位数要注意,打开如下图:
在这里插入图片描述
添加到库目录
在这里插入图片描述
(c).在vs中配置完环境后,还需要配置调用MATLAB引擎时的输入文件,

libeng.lib
libmat.lib
libmex.lib
libmx.lib

在这里插入图片描述
配置结束
(d)在windows系统的环境变量—path中添加当前系统位数对应的MATLAB运行目录
在这里插入图片描述

本文在系统环境path中添加如上图所示

2. 在VS中配置MATLAB 目录:

在matlabcommand window输入

mex -setup -V

在这里插入图片描述
在这里插入图片描述
出现:“找到已安装的编译器……”
下面选择不同的语言就选择:mex -setup C++
即上图的前两个框框。
到此配置结束

VS2019 的cuda项目中调用MATLAB

调用方式有两种:(1)调用MATLAB引擎; (2)调用MATLAB函数生成的DLL。

(1)调用MATLAB引擎

首先,因为我们前面在依赖库(lib)中添加了
libeng.lib
libmx.lib
libmat.lib
所以,添加头文件 **#include “engine.h”**可以调用MATLAB引擎。
或者说没有添加lib,可以在代码中添加

// import necessary lib
#pragma comment( lib, "libeng.lib")
#pragma comment( lib, "libmx.lib")
#pragma comment( lib, "libmat.lib")

MATLAB引擎调用和文件操作类似:打开、关闭操作。
打开引擎:

Engine *ep;  
if (!(ep = engOpen("\0")))  
{  
    fprintf(stderr, "\nCan't start MATLAB engine\n");  
    return EXIT_FAILURE;  
} 

定义变量需要转换为matlab的格式。比如使用:mxCreateDoubleMatrix 和 memcpy函数。
将数据传入引擎使用:engPutVariable()。
接着调用 engEvalString(ep, “matlab指令”)matlab的指令作为参数进行操作。
计算操作等完成后需要清理操作:mxDestroyArray()函数清理mxCreateDoubleMatrix 生成的变量。
engClose()关闭引擎。

https://blog.csdn.net/wokaowokaowokao12345/article/details/80839187

主要用到的
1、engOpen():打开MATLAB引擎;

2、mxCreateDoubleMatrix():创建MATLAB变量矩阵;

3、mxGetPr():获取MATLAB变量的地址值;

4、memcpy():将C语言中的变量值赋值给MATLAB变量;

5、engPutVariable():将创建的MATLAB变量放至MATLAB工作空间;

6、engEvalString():执行字符串形式的MATLAB语句;

7、mxDestroyArray():释放MATLAB中创建的变量,释放内存;

8、engClose():关闭MATLAB引擎。


#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "engine.h"     // add header file

// import necessary lib
#pragma comment( lib, "libeng.lib")
#pragma comment( lib, "libmx.lib")
#pragma comment( lib, "libmat.lib")


int main(void)
{
    Engine *ep;

    // open engine
    if (!(ep = engOpen("\0")))
    {
        fprintf(stderr, "\nCan't start MATLAB engine\n");
        return EXIT_FAILURE;
    }

    // generate variables
    int Nsample = 50;
    const double PI = 3.1415926;
    double *t = new double[Nsample];

    for (int i = 0; i < Nsample; i++)
    {
        t[i] = i * 2 * PI / Nsample;
    }

    mxArray *T = NULL, *result = NULL;
    T = mxCreateDoubleMatrix(1, Nsample, mxREAL);
    memcpy((void *)mxGetPr(T), (void *)t, Nsample*sizeof(t[0]));

    engPutVariable(ep, "T", T);         // put data to engine

    // execute matlab operations
    engEvalString(ep, "Y=sin(T);");
    engEvalString(ep, "plot(T,Y);");
    engEvalString(ep, "title('y=sin(t)');");
    engEvalString(ep, "xlabel('t');");
    engEvalString(ep, "ylabel('y');");

    printf("Hit return to continue\n");
    fgetc(stdin);

    // clean operation(don't forget!!!)
    mxDestroyArray(T);
    engEvalString(ep, "close;");

    // close engine
    engClose(ep);

    return EXIT_SUCCESS;
}

在这里插入图片描述

(2)调用MATLAB函数生成的DLL

首先,将matlab完成的功能写成matlab函数,
其次,利用mcc命令编译,得到一系列文件
然后,将生成的 .h 、 .dll 、 .lib、文件放在c/c++/cuda工程目录下
最后,在需要画图的cpp文件中加入代码

function showBER(SNR_indB,BER)
semilogy(SNR_indB,BER,'-o','linewidth',2);
grid on
xlabel('E_b/N_0(dB)');
ylabel('BER');

在这里插入图片描述
mcc -B csharedlib:showBER showBER.m
在这里插入图片描述
在这里插入图片描述
在需要画图的cpp文件中加入下面的代码

#include "showBER.h"

#pragma comment( lib, "libeng.lib" )
#pragma comment( lib, "libmx.lib" )
#pragma comment( lib, "libmat.lib" )
#pragma comment( lib, "mclmcrrt.lib" )
#pragma comment( lib, "showBER.lib" )

void main(void)
{
    double SNR[] = { 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5 };
    double BER[] = { 9.728816e-002, 8.099609e-002, 5.633803e-002, 3.733608e-002, 1.253970e-002, 3.936489e-003, 1.206820e-003, 2.104052e-004, 3.109879e-005, 3.365857e-006, 2.565067e-007 };
    int len = sizeof(SNR) / sizeof(SNR[0]);

    showBERInitialize();

    mxArray* xSNR = mxCreateDoubleMatrix(1, len, mxREAL);
    memcpy(mxGetPr(xSNR), (void*)SNR, sizeof(SNR));
    mxArray* xBER = mxCreateDoubleMatrix(1, len, mxREAL);
    memcpy(mxGetPr(xBER), (void*)BER, sizeof(BER));

    mlfShowBER(xSNR, xBER);
    system("PAUSE");

    showBERTerminate();
}

运行cpp文件的结果
在这里插入图片描述

遇到的问题

在加载的模块中未找到当前堆栈帧。无法显示此位置的源代码

https://blog.csdn.net/lvh98/article/details/124754645
在这里插入图片描述

0xc0000005处理
“帧不在模块中。在加载的模块中未找到当前堆栈帧。无法显示此位置的源代码。”
可以搜异常信息0xc0000005:读取位置0x0000000000000008

https://blog.csdn.net/andy_5826_liu/article/details/84985766?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2defaultCTRLISTRate-1-84985766-blog-92829381.pc_relevant_antiscanv2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2defaultCTRLISTRate-1-84985766-blog-92829381.pc_relevant_antiscanv2&utm_relevant_index=2

1.调试–>窗口–>异常设置
在这里插入图片描述2.取消勾选Win32 Exceptions
在这里插入图片描述
如果后边程序正常运行但是输出窗口有异常信息
xsd_binder::MalformedDocumentError,
下面的可以解决这个问题。

Debug错误:xsd_binder::MalformedDocumentError

https://blog.csdn.net/pacificyang/article/details/81080052

解决:
调试器类型(debugger type):自动(auto)修改成混合(mixed)

在这里插入图片描述
将调试器类型改为混合,即使在异常设置中不取消勾选Win32 Exceptions,程序也能正常运行,且没有异常信息。

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

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

相关文章

建设 TiDB 自动化平台:转转 DBA 团队实践

转转技术 . 转转研发中心及业界小伙伴们的技术学习交流平台&#xff0c;定期分享一线的实战经验及业界前沿的技术话题。 各种干货实践&#xff0c;欢迎交流分享&#xff0c;如有问题可随时联系 waterystone ~ 莫善 转转 DBA。 负责 TiDB&#xff0c;MongoDB&#xff0c;MySQL 运…

Python调用MMDetection实现AI抠图去背景

这篇文章的内容是以 《使用MMDetection进行目标检测、实例和全景分割》 为基础&#xff0c;需要安装好 MMDetection 的运行环境&#xff0c;同时完成目标检测、实例分割和全景分割的功能实践&#xff0c;之后再看下面的内容。 想要实现AI抠图去背景的需求&#xff0c;我们需要…

linux高级命令之互斥锁

互斥锁学习目标能够知道互斥锁的作用1.互斥锁的概念互斥锁: 对共享数据进行锁定&#xff0c;保证同一时刻只能有一个线程去操作。注意:互斥锁是多个线程一起去抢&#xff0c;抢到锁的线程先执行&#xff0c;没有抢到锁的线程需要等待&#xff0c;等互斥锁使用完释放后&#xff…

2023-JavaWeb最新整理面试题-TCP、Tomcat、Servlet、JSP等

Java基础面试题 一、JavaWeb专题 1.HTTP响应码有哪些 1、1xx&#xff08;临时响应&#xff09; 2、2xx&#xff08;成功&#xff09; 3、3xx&#xff08;重定向&#xff09;&#xff1a;表示要完成请求需要进一步操作 4、4xx&#xff08;错误&#xff09;&#xff1a;表示请…

MySQL锁之深入死锁分析

文章目录1 死锁产生原因分析1.1 产生原因1.2 产生示例1.2.1 案例一1.2.2 案例二1.2.3 案例三1.2.4 案例四1.2.5 案例五1.2.6 案例六1.3 死锁预防策略1.4 剖析死锁的成因1.5 解除死锁的占用1.5.1 死锁分析1.5.2 死锁解决1 死锁产生原因分析 点击此处了解MySQL各种锁分析 1.1 产…

为什么计算机需要操作系统?(一文详解~)

我们从三个方面来简单聊聊为什么计算机系统操作系统这个话题。 资源分配器 如果你的CPU上只需要运行一个程序&#xff0c;那么你的确不需要操作系统。 可是&#xff0c;一旦你的CPU上需要再运行一个程序&#xff0c;那么马上就会面临一个问题&#xff1a;两个程序开始竞争资源…

山东大学教授团畅谈ChatGPT革命座谈会,探讨ChatGPT发展趋势

2月18日&#xff0c;由山东大学多院系教授学者组成的山东大学教授团在济南福瑞达自贸创新产业园举行了“畅谈ChatGPT革命”座谈会&#xff0c;诸位教授学者就ChatGPT出现的影响进行了探讨。产业园首席顾问李铁岗教授向大家介绍产业园区山东大学经济学院教授、济南福瑞达自贸创新…

2023年美国大学生数学建模A题:受干旱影响的植物群落建模详解+模型代码(二)

前言 资源放CSDN上面过不了审核,都快结束了都没过审真的麻了,订阅专栏的同学直接加我微信直接发你。我只打造优质专栏。专注建模四年,博主参与过大大小小数十来次数学建模,理解各类模型原理以及每种模型的建模流程和各类题目分析方法。此专栏的目的就是为了让零基础快速使…

音视频基础之音频编码原理简介

一&#xff1a;隐蔽信号 数字音频信号如果不加压缩地直接进行传送&#xff0c;将会占用极大的带宽。例如&#xff0c;一套双声道数字音频若取样频率为44.1KHz&#xff0c;每样值按16bit量化&#xff0c;则其码率为&#xff1a; 244.1kHz16bit1.411Mbit/s 如此大的带宽将给信号…

linux系统编程2--网络编程socket知识

在linux系统编程中网络编程是使用socket&#xff08;套接字&#xff09;&#xff0c;socket这个词可以表示很多概念&#xff1a;在TCP/IP协议中&#xff0c;“IP地址TCP或UDP端口号”唯一标识网络通讯中的一个进程&#xff0c;“IP地址端口号”就称为socket。在TCP协议中&#…

(考研湖科大教书匠计算机网络)第五章传输层-第八节2:TCP连接管理实践部分

获取pdf&#xff1a;密码7281专栏目录首页&#xff1a;【专栏必读】考研湖科大教书匠计算机网络笔记导航 此部分为补充内容&#xff0c;主要使用Java实现TCP和UDP通信 一&#xff1a;UDP通信 &#xff08;1&#xff09;Java数据报套接字通信模型 Java UDP通信模型&#xff…

算法笔记(十)—— 哈希函数和哈希表

认识哈希函数和哈希表的实现 哈希函数 哈希函数&#xff1a;输入域无穷&#xff0c;输出域&#xff08;哈希值&#xff09;相对有限 哈希函数&#xff1a;相同的输入一定会返回相同的输出值 由于输入域的无限和输出域的有限&#xff0c;不同的输入可能会返回相同的输出&…

配置Tomcat性能优化

配置Tomcat性能优化 &#x1f4d2;博客主页&#xff1a; 微笑的段嘉许博客主页 &#x1f4bb;微信公众号&#xff1a;微笑的段嘉许 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐留言&#x1f4dd; &#x1f4cc;本文由微笑的段嘉许原创&#xff01; &#x1f4…

常用类(五)System类

(1)System类常见方法和案例&#xff1a; &#xff08;1&#xff09;exit:退出当前程序 我们设计的代码如下所示&#xff1a; package com.ypl.System_;public class System_ {public static void main(String[] args) {//exit: 退出当前程序System.out.println("ok1"…

详解C++的类型转换

文章目录前言一、C语言中的类型转换二、为什么C需要四种转换三、C强制类型转换3.1 static_cast3.2 reinterpret_cast3.3 const_cast3.4 dynamic_cast四、RTTI总结前言 在C语言的类型转换有一个非常大的坑,有好多悄悄地转换,有时候把我们转换的就蒙了,因为C要兼容C语言,所以C就…

docker容器单机网络

前言 通过文章 容器的本质可知&#xff0c;容器只是一个进程&#xff0c;而容器所能看到的网络栈&#xff0c;是隔离在自己的 Network Namespace 中。docker 容器单机网络支持四种网络模式&#xff0c;也都是基于 Network Namespace 实现的。本文主要是介绍这四种模式的使用方…

四、actions处理异步行为和调用

四、actions处理异步行为和调用 action&#xff1a;装方法的一个对象。 使用场景&#xff1a;在Vuex运行的环节中&#xff0c;有异步操作——>就必须经过action mutations不能进行异步操作。 最常用的案例&#xff1a;异步请求获取数据 使用方式&#xff1a; 组件中使用a…

移动WEB开发一、基础知识

零、文章目录 文章地址 个人博客-CSDN地址&#xff1a;https://blog.csdn.net/liyou123456789个人博客-GiteePages&#xff1a;https://bluecusliyou.gitee.io/techlearn 代码仓库地址 Gitee&#xff1a;https://gitee.com/bluecusliyou/TechLearnGithub&#xff1a;https:…

git ssh配置

ssh配置 执行以下命令进行配置 git config --global user.name “这里换上你的用户名” git config --global user.email “这里换上你的邮箱” 执行以下命令生成秘钥&#xff1a; ssh-keygen -t rsa -C “这里换上你的邮箱” 执行命令后需要进行3次或4次确认。直接全部回车就…

基于 ChatGPT 3.5 和 Bing 搜索引擎的会话式搜索引擎 Perplexity 初体验

一、背景 最近 ChatGPT 非常火爆&#xff0c;但是基础版经常访问失败&#xff0c;于是乎想找一些替代品。 搜到了一个 基于 ChatGPT 3.5 和 Bing 搜索的会话式搜索引擎 Perplexity 体验了下非常不错&#xff0c;值得推荐。 二、联系和区别 2.1 联系 官网在外媒社交媒体上…