vs2019调用matlab2021混合编程

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,程序也能正常运行,且没有异常信息。

  • 9
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
MatlabVS2019混合编程是指在Visual Studio 2019使用Matlab引擎来调用和执行Matlab代码。这种混合编程的方式可以让你在VS2019利用Matlab的强大数学和科学计算功能,以及现有的C++或C#代码。 要实现MatlabVS2019混合编程,你需要按照以下步骤进行操作: 1. 安装Matlab引擎: 首先,确保你已经安装了Matlab软件,并且选择了安装Matlab引擎选项。这可以在Matlab安装程序选择安装组件时完成。 2. 创建一个新的VS2019项目: 打开Visual Studio 2019,并创建一个新的项目,选择你想要的编程语言(如C++或C#)。 3. 添加Matlab引擎库文件: 在VS2019,右键点击你的项目,在上下文菜单选择“属性”选项。然后,在属性窗口,找到“配置属性”->“链接器”->“输入”部分,并添加以下两个库文件路径: - Matlab安装目录\extern\lib\win64\microsoft (对于64位系统) - Matlab安装目录\bin\win64 (对于64位系统) 4. 添加Matlab头文件路径: 在属性窗口,找到“配置属性”->“C/C++”->“常规”部分,添加以下头文件路径: - Matlab安装目录\extern\include 5. 编写和调用Matlab代码: 在你的VS2019项目,编写用于调用Matlab引擎的代码。你可以使用Matlab引擎提供的函数来执行Matlab代码,并将结果返回到你的C++或C#程序。 6. 构建和运行项目: 最后,构建并运行你的VS2019项目,以执行Matlab代码并查看结果。 以上是一个简单的介绍,帮助你开始MatlabVS2019混合编程。具体的实现方法可能涉及到你的具体项目需求和编程语言。你可以参考Matlab官方文档和VS2019的相关资源来获得更多详细信息和示例代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值