Matlab与Visual Studio的联合编程

来源:互联网 发布:极客学院 tensorflow 编辑:程序博客网 时间:2024/05/17 23:32

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.csdn.net/DataServiceStudio