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