由于在下才疏学浅,在网上看各高手指南时亦觉云里雾里,遂决定一切说明从最基础说起,一是方便自己(记性奇差),二是方便似我的小白。以下部分是我从各网站论坛等摘抄、重组、改写过的,以求更加详实明朗,由于参考较多,便不一
一列举,相信在baidu前三页各位能够找到我所引用的内容。在这里,向前辈们致敬!
闲话少序。
首先,说最简单环境,我的是matlab2012a,vs2010。
其次,创建C++函数:若想将matlab中部分函数C++化,先在vs中新建一个cpp文件(注意,不是新建项目,否则#include
不对)。这个文件(我们管它叫mex文件)的名字就是将来在matlab中调用函数的名字,所以别随便起。这个文件是有一定格式的:
*一个C/C++的MEX源程序通常包括4个组成部分,其中前3个是必须包含的内容,第4个则根据所实现的功能灵活选用
*(1) #include “mex.h”;
*(2)MEX文件的入口函数mexFunction, MEX文件导出名必须为mexFunction函数;
*(3)mxArray;
*(4)API函数
这里,举个最简单的样例:
#include
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray
*prhs[])
{ mexPrintf("hello,world!/n");
}
以上,就是一个最简单的mex文件。关于mexFunction,可以认定是一个接口函数,有一定的规则:
nlhs:输出参数数目
plhs:指向输出参数的指针数组
nrhs:输入参数数目
prhs: 指向输入参数的指针数组
同样举个例子:
在matlab Command
Window(命令窗口)中调用时(当然是编译后,下一步讲),如:[a,b]=test(c,d,e),*prhs[0]=c
*prhs[1]=d
*prhs[2]=e,当函数返回时,将会把你放在plhs[0],plhs[1]里的地址赋给a和b,达到返回数据的目的。比如mex文件helloworld:
#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray
*prhs[])
{
int i;
i=mxGetScalar(prhs[0]);
if(i==1)
mexPrintf("hello,world!\n");
else
mexPrintf("大家好!/n");
}
当在matlab写:helloworld(1)时,打印出“hello,world”;否则打印出“大家好!”
接着,在matlab中编译:首先在命令窗口(格式稍加改动,不影响参照):
>>mex -setup 有:
Welcome to mex -setup. This utility will help you set up
a default compiler. For a list of supported compilers, see
http://www.mathworks.com/support/compilers/R2012a/win32.html
Please choose your compiler for building MEX-files:
Would you like mex to locate installed compilers [y]/n?
输入:y 有:
Select a compiler:
[1] Lcc-win32 C 2.4.1 in E:\MATLAB~1\sys\lcc
[2] Microsoft Visual C++ 2010 in D:\vs2010
[0] None
Compiler:
输入:2 有:
Please verify your choices:
Compiler: Microsoft Visual C++ 2010
Location: D:\vs2010
Are these correct [y]/n?
输入:y 就行了。然后会出一堆别的东西,不用理它。
然后,敲下:
>>cd
D:\matlab试验田\matlab调C++\hello2 其中,cd后的一串是刚才mex文件所在的文件夹,即路径。
接着,敲下:
>>mex helloworld2.cpp
其中,mex后面就是mex文件的文件名,也就是C++函数,之后会生成helloworld2.mexw32(64位的会生成
.mexw64)文件,在matlab当前文件夹(Current
Folder中会有显示,相应的,在mex文件所在文件夹中也有体现)。
最后,在matlab中调用C++函数:像matlab中调用普通函数即可。比如第二步中:
>>[a,b]=test(c,d,e)
(test就是C++函数,用就行了),比如:
>>helloworld2 就会直接显示:hello
world!
至此,最简单的matlab调用C++函数告一段落。