MATLAB是一门在数值运算方面非常高效的语言,编程简单可以快速实现算法。但是Matlab程序运行缓慢,尤其是循环计算更是慢的无法忍受。为此介绍一种在Matlab中调用c++程序并调试的方法,使用c++处理耗时的程序可以大大提高Matlab的效率。
一、软件环境
1、Matlab R2011b下载地址http://pan.baidu.com/share/link?shareid=294244&uk=1745344366
2、Microsoft Visual Studio 2010下载地址http://www.microsoft.com/zh-cn/download/details.aspx?id=12187
3、分别安装好软件打开Matlab 在命令行输入mex –setup设置编译器。

选择y显示已经安装的编译器。

4、选择第2项C++编译器。

最后选择y确认,等待命令结束。支持软件环境设置完成。
二、C++程序编写方法
可以直接在Matlab中编写,也可以在VS中写好了再修改到Matlab。例如在Matlab中调用Image=ham(I_gray,H)函数,ham()函数是要用C++编写的程序,作用是对I_gray灰度图像使用H矩阵进行滑动窗口操作。具体C+程序编写方法如下:
1、新建ham.cpp文件,程序比较简单直接在matlab中编辑。

2、C++的主函数必须是mexFunction(),相当于普通C/C++程序的main()函数,参数的格式也是必须固定,且必须包含mex.h头文件。
#include "mex.h"
void mexFunction(intnlhs,mxArray *plhs[],int nrhs,const mxArray*prhs[])
{
...
}
参数的具体含义
nlhs:输出参数数目
plhs:指向输出参数的指针
nrhs:输入参数数目
prhs:指向输入参数的指针
例如,本例中
prhs[0]= I_gray
prhs[1]=H
调用方式如下:
void mexFunction(intnlhs,mxArray *plhs[],int nrhs,const mxArray*prhs[])
{
double* Lp = (double*)mxGetPr(prhs[0]); //矩阵I_gray指针
int rowNum =mxGetM(prhs[0]); //获取矩阵行
int colNum =mxGetN(prhs[0]); //获取矩阵列
double* Bp = (double*)mxGetPr(prhs[1]); //矩阵H指针
plhs[0]= mxCreateDoubleMatrix(rowNum, colNum, mxREAL); //为输出变量申请空间
double *a =mxGetPr(plhs[0]); //获取输出变量指针
...
}
输出参数需要在mex函数内申请到内存空间,才能将指针放在plhs[]中传递出去。由于返回指针类型必须是mxArray,所以Matlab专门提供了一个函数:mxCreateDoubleMatrix来实现内存的申请,函数原型如下:
mxArray*mxCreateDoubleMatrix(int m, int n, mxComplexity ComplexFlag)
m:待申请矩阵的行数
n:待申请矩阵的列数
在mexFunction函数中可以按照常规C++程序编写调用其他函数。
3、C++程序编写完成后,在matlab命令行中使用mex ham.cpp命令编译

注意:要在VS中调试需要使用mex –g ham.cpp生成调试版本
最后生成文件

二、Matlab和VS联合调试方法
1、打开,VS 2010选择Tools /Attachto Process

2、选择MATLAB.exe进程,选择Attach。然后File/open打开刚才编辑的cpp文件,设置断点。

3、在Matlab中运行程序就能到ham.cpp的断点处,可以查看变量并调试。

三、结果对比
分别用C++和编写的函数和Matlab自带滑动窗口函数nlfilter()对比,可以看到使用C++程序运行时间只有1/100都不到,效率提升非常明显。

DataService工作室 http://blog.youkuaiyun.com/DataServiceStudio
本文介绍了如何在Matlab中调用C++程序以提高计算效率,特别是在图像处理任务上。通过设置Matlab与Visual Studio的编译器,编写C++ mex函数,并在VS中进行调试。结果显示,使用C++编写的函数比Matlab内置的nlfilter()运行速度快了约100倍,大大提升了效率。
1942

被折叠的 条评论
为什么被折叠?



