在Visual Studio中开发Matlab mex文件,生成mexw64/mexw32

简介:



csunking贡献,2015-9-22 1712

1、   概述

通过使用C/C++与Matlab混合编程,既可以享受到C代码快速执行的速度,又可以方便的使用Matlab众多的库函数和强大的绘图功能。让Matlab调用C函数是通过DLL文件实现的,而这个DLL的开发过程不仅仅可以使用Matlab自带的mex命令,还可以使用VC++开发环境,使用VC有很多好处,一是让我回到了原来熟悉的开发环境中,二能够使用更加标准的C++编译器,第三点也是最爽的,可以使用VC强大的调试功能。

 

此次文档更新时使用的开发环境为:Visual Studio 2012, Matlab R2015a

 

2、   步骤

1.启动VS,新建一个空的项目ATSRID。然后配置项目属性信息。然后,新建一个.cpp文件atsrid.cpp。并在添加Preprocessor Definitions中添加MATLAB_MEX_FILE的宏定义。

                

将输出文件的后缀名改为mexw64/mexw32

$(OutDir)$(TargetName).mexw64

 

配置项目生成程序的平台位数属性

2. 为matlab函数提供头文件和静态库的支持

包含目录:

E:\Program Files\MATLAB\R2015a\extern\include

E:\Program Files\MATLAB\R2015a\extern\include\win64

库目录

E:\Program Files\MATLAB\R2015a\extern\lib\win64\microsoft

连接器中添加静态链接库文件

libmx.lib;libmat.lib;libmex.lib;

 

3. 在atsrid.cpp中编写mex文件中的内容。然后用利用.def文件导出mexFunction函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "mex.h"
 
void  mexFunction( int  nlhs,mxArray *plhs[], int  nrhs, const  mxArray *prhs[])
{
     int  nlhs1,nrhs1;
     mxArray *plhs1[1],*prhs1[1];
     mxArray *array_ptr;
  
     nlhs1=1;
     nrhs1=1;
 
     if ((array_ptr=mexGetVariable( "base" , "x" ))==NULL)    //"base" means the command window where
     {                                                    //we get the matrix "x".
         mexErrMsgTxt( "Variable 'x' not in the workspace." );
     }
     else
     {
         prhs1[0]=array_ptr;
         mexCallMATLAB(nlhs1,plhs1,nrhs1,prhs1, "det" );
         mexPrintf( "Det(array_ptr) == %g\n" ,mxGetScalar(plhs1[0]));
     }
 
}

 

 

让函数从DLL中的导出有两种方法,__declspec(dllexport)命令导出和def文件导出,但由于需要导出mexFunction在”mex.h”中已经定义,所以前一种导出方法行不通,这里采用def文件导出。

首先告诉编译器我使用了xx.def文件,然后再在文件中加入内容。通过上述方式定义的def文件会自动添加入下面的属性中。

 

文件中的内容如下

LIBRARY ATSRID; 指的是模块名称(可以用新建的项目名称)

EXPORTS mexFunction

 

4. 编译运行,生成ATSRID.mexw64文件。然后将该文件拷贝到Matlab的当前目录下,然后进行该模块的测试
x=magic(100);

ATSRID();

可以将结果与det(x)得到的相比较,查看是否正确。

 

备注:在VS项目中的atsrid.cpp可以直接放在matlab的当前目录下进行mex atsrid.cpp编译,也同样可以生成atsrid.mexw64。之所以在Visual C++中进行编译,是因为方便调试该程序。下面也将介绍另外一种调试方法。

 

 

3、  采用VS Debug mex文件

方便对各位在matlab上的researcher or developer。

1、初次使用mex时需要配置配置matlab mex编译器

mex -setup

2、接下来,用-g选项编译mex源文件,-g表示编译结果中包含调试信息。

mex -g atsrid.cpp

 

3、开启Visual Studio,不要关闭你的matlab。在Visual Studio的工具菜单中,选择关联到一个进程。

  

Visual Studio会加载数据,在弹出的对话框中选择,选择matlab进程,点击“关联”。

 

4、首先在Visual Studio的ATSRID项目中的atsrid.cpp文件代码处添加断点。然后,打开matlab 放置atsrid.mexw64的当前目录,在代码行中输入下面的代码

x=magic(10);

atsrid();

 

之后,会发现Visual Studio会自动将程序运行到断点出,等待下一步的操作。

 

当断点被触发了,你就可以利用Visual Studio来查看你的变量,内存,调试你的程序了。

引用

似水流年,2009,http://knhunter.blogbus.com/.

 

没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。







  本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/arxive/p/5103792.html ,如需转载请自行联系原作者


相关文章
matlab读取csv文件csvread()
matlab读取csv文件csvread()
|
1月前
|
存储 缓存 算法
基于FPGA的图像双边滤波实现,包括tb测试文件和MATLAB辅助验证
基于FPGA的图像双边滤波实现,包括tb测试文件和MATLAB辅助验证
|
1月前
|
传感器 算法 计算机视觉
基于肤色模型和中值滤波的手部检测算法FPGA实现,包括tb测试文件和MATLAB辅助验证
该内容是关于一个基于肤色模型和中值滤波的手部检测算法的描述,包括算法的运行效果图和所使用的软件版本(matlab2022a, vivado2019.2)。算法分为肤色分割和中值滤波两步,其中肤色模型在YCbCr色彩空间定义,中值滤波用于去除噪声。提供了一段核心程序代码,用于处理图像数据并在FPGA上实现。最终,检测结果输出到"hand.txt"文件。
|
1月前
|
算法 异构计算
基于FPGA的图像高斯滤波实现,包括tb测试文件和MATLAB辅助验证
基于FPGA的图像高斯滤波实现,包括tb测试文件和MATLAB辅助验证
|
1月前
|
算法 计算机视觉 异构计算
基于FPGA的图像形态学腐蚀算法实现,包括tb测试文件和MATLAB辅助验证
基于FPGA的图像形态学腐蚀算法实现,包括tb测试文件和MATLAB辅助验证
|
19天前
|
算法 计算机视觉 异构计算
基于FPGA的图像直方图均衡化处理verilog实现,包含tb测试文件和MATLAB辅助验证
摘要: 在FPGA上实现了图像直方图均衡化算法,通过MATLAB2022a与Vivado2019.2进行仿真和验证。核心程序涉及灰度直方图计算、累积分布及映射变换。算法旨在提升图像全局对比度,尤其适合低对比度图像。FPGA利用可编程增益器和查表技术加速硬件处理,实现像素灰度的均匀重分布,提升视觉效果。![image preview](https://ucc.alicdn.com/pic/developer-ecology/3tnl7rfrqv6tw_a075525027db4afbb9c0529921fd0152.png)
|
1月前
|
算法 计算机视觉 异构计算
基于肤色模型的人脸识别FPGA实现,包含tb测试文件和MATLAB辅助验证
这是一个关于肤色检测算法的摘要:使用MATLAB 2022a和Vivado 2019.2进行测试和仿真,涉及图像预处理、RGB到YCbCr转换、肤色模型(基于阈值或概率)以及人脸检测。核心程序展示了如何读取图像数据并输入到FPGA处理,通过`tops`模块进行中值滤波、颜色空间转换及人脸检测,最终结果输出到"face.txt"。
|
1月前
|
算法 异构计算
基于直方图的图像曝光量分析FPGA实现,包含tb测试文件和MATLAB辅助验证
该内容包括了算法的运行效果展示、软件版本信息、理论概述和核心程序代码。在正常图像中,`checkb`位于`f192b`和`f250b`之间,而多度曝光图像中`checkb`超出此范围,判断为曝光过度。使用的软件为Vivado 2019.2和MATLAB 2022a。理论依据未详细给出,但提及主要方法。提供的Verilog代码段用于处理图像数据,包括读取文件、时钟控制及图像histogram计算等,其中模块`im_hist`似乎是关键部分。
|
1月前
|
算法 TensorFlow 算法框架/工具
基于直方图的图像阈值计算和分割算法FPGA实现,包含tb测试文件和MATLAB辅助验证
这是一个关于图像处理的算法实现摘要,主要包括四部分:展示了四张算法运行的效果图;提到了使用的软件版本为VIVADO 2019.2和matlab 2022a;介绍了算法理论,即基于直方图的图像阈值分割,通过灰度直方图分布选取阈值来区分图像区域;并提供了部分Verilog代码,该代码读取图像数据,进行处理,并输出结果到"result.txt"以供MATLAB显示图像分割效果。
|
1月前
|
算法 计算机视觉 异构计算
基于FPGA的图像累积直方图verilog实现,包含tb测试文件和MATLAB辅助验证
该内容展示了FPGA实现图像累积直方图的算法。使用Vivado2019.2和matlab2022a,通过FPGA的并行处理能力优化图像处理。算法基于像素值累加分布,计算图像中像素值小于等于特定值的像素个数。核心代码为`test_image`模块,读取二进制图像文件并传递给`im_hist`单元,生成直方图和累积直方图。