点云技术相关产学研社区

 找回密码
 立即注册加入PCL中国点云技术相关产学研社区

扫一扫,访问微社区

查看: 2505|回复: 0

MATLAB编译并调用C、C++程序

[复制链接]
发表于 2017-8-7 10:00:27 | 显示全部楼层 |阅读模式
本帖最后由 zaqq357 于 2017-8-7 10:04 编辑

    相比于c、c++,matlab的效率较低,为了解决这个问题,大家在matlab中调用c、c++,也就是说matlab调用的一些函数,本身是由c、c++编写完成的,执行的时候也是在c、c++编译器中执行。实现这个功能的媒介是后缀为mex的文件, mex文件的后缀有:mexw32,mexw64,mexmaci,mexglx,mexa64等,mexext指令能看到。mexw32和mexw64分别是windows 32位操作系统和64位操作系统。mexmaci应该是苹果操作系统,mexglx和mexa64分别是Linux 32位操作系统和64位操作系统。
      MATLAB的C、C++程序编译器的设置:  在命令窗口中输入: >>mex -setup ,接着按照提示进行即可完成C、C++程序编译器的设置。
    在MATLAB中编译C、C++程序:  C、C++程序的格式以test.cpp为例,如下示:
C、C++程序的格式以 test.cpp 为例,如下示:
#include "mex.h" //必须
#include <math.h>
//程序功能实现函数
void Desc2Pol ( double dbX, double dbY, double *pdbA, double *pdbG )
{
*pdbA = sqrt(dbX * dbX + dbY * dbY );
if (dbY == 0 )
{
if ( dbX < 0 )  
{   
*pdbG = -90;  
}  
else
{   
*pdbG = 90;  
}
}
else
{  
*pdbG = atan( dbX/dbY );
}
}
//Matlab的接口函数,必须而且格式也一样
void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] )
{   
/*        
其中nlhs为在Matlab环境中调用该函数时要求返回参数的个数        
nrhs为在Matlab环境中调用该函数时输入参数的个数
plhs在Matlab环境中调用该函数时要求返回参数的队列        
prhs在Matlab环境中调用该函数时输入参数的队列
*/  
int  mrows = 0;
int  ncols = 0;   
double dbX  = 0;
double dbY  = 0;
double *pdbA = NULL;
double *pdbG = NULL;
/* Check for proper number of arguments. 检查输入、输出参数个数 */      
//必须是2个输入参数   
//包括
if ( nrhs != 2 )  
{  
mexErrMsgTxt("Two input required.");
}      
//必须是2个输出参数   
//包括
if ( nlhs != 2 )   {  
mexErrMsgTxt("Two output required.");
}   
/* Check for proper type of arguments . 检查输入、输出参数类型 */   
mrows = mxGetM(prhs[0]);
ncols = mxGetN(prhs[0]);
if ( mxIsComplex(prhs[0]) ||   !(mrows == 1 && ncols == 1))  
{  
mexErrMsgTxt("The First input must be a noncomplex scalar double precision.");
}   
mrows = mxGetM( prhs[ 1 ] );
ncols = mxGetN( prhs[ 1 ] );
if ( mxIsComplex( prhs[ 1 ] ) ||   !(mrows == 1 && ncols == 1 ) )  
{
  mexErrMsgTxt("The fourth input must be a noncomplex scalar double precision.");
}  
dbX = mxGetScalar( prhs[ 0 ] );
dbY = mxGetScalar( prhs[ 1 ] );   
/* Create matrix for the return argument. */
plhs[0] = mxCreateDoubleMatrix( mrows, ncols, mxREAL );
plhs[1] = mxCreateDoubleMatrix( mrows, ncols, mxREAL );   
/* Assign pointers to each input and output. */
pdbA = mxGetPr( plhs[0] );
pdbG = mxGetPr( plhs[1] );   
Desc2Pol( dbX, dbY, pdbA, pdbG );
}  

将 MATLAB 的工作目录切换至 test.cpp 所在目录,在 MATLAB 的命令窗口中,输入: >>mex test.cpp ,若程序有错,会有提示,若无错,会在test.cpp的旁边生成test.mexw64(64位系统)文件,这个文件可以供MATLAB调用实现 test.cpp 中的 C、C++函数的功能。

在 MATLAB 中调用 C、C++程序:
将 MATLAB 的工作目录切换至上面已编译好的 test.mexw64所在的目录,在 MATLAB 的命令窗口中输入: >>[a b] = test(1,1); 即可实现调用 C、C++程序。



回复

使用道具 举报

本版积分规则

QQ|小黑屋|点云技术相关产学研社区 ( 陕ICP备13001629号 )

GMT+8, 2024-5-2 17:55 , Processed in 5.605326 second(s), 16 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表