转载:http://www.blogbus.com/shijuanfeng-logs/106781870.html
1. 在MATLAB命令行敲:mex -setup,选择你所使用的C++版本,装上mex
2. 用“mex [参数] *.cpp”, eg:mex -O -c svm.cpp
这时在当前目录下就会生成*.mexw32,*.mexw64的文件,这个文件类似于c++的dll文件,MATLAB可以直接调用。
当前,上述的cpp文件不是我们平时所写的以main函数为入口,而是是mexFunction函数为入口,当然,还有其他不同,以下会进一步说明。
Mex文件的产生和调试(版本:VC++6.0和MATLAB7.0):(网上的实例不对,我在此进行了修正,请注意:删除线化掉的部分)
1. 建立 MFC 动态链接工程
(1) 建立一个名为 sum_prod 的 MFC 动态链接工程
(2) 单击 OK 按钮,出现对话框,选择使用 静态链接 MFC 的 DLL ,其它采用默认设置。
在上面的 VC 工程中,进行以下设置
(1) VC++6.0 环境设置
单击菜单 Tools ,单击 Options… 菜单项,出现 Options 对话框,选择 Directories 标签,在 include files 里面加入:
C:\MATLAB6P5\EXTERN\INCLUDE
在 Library files 里面加入:
C:\MATLAB6P5\EXTERN\LIB\WIN32\MICROSOFT\MSVC60
2) VC++6.0 工程设置
单击菜单 Project ,单击 Setting… 菜单项,出现 Project Setting 对话框,选择 Link 标签,在 Object/library modules: 下面的文本框内容的后面加入 libmx.lib libmex.lib libmatlbmx.lib libmat.lib
(1) mex 命令设置
(a) 运行 Matlab ,在 Matlab 的命令窗口 (Command Window) 键入“ mex -setup ”命令后,按回车键,安装 Matlab 编译器;
(b) 命令窗口出现如下提示:
Please choose your compiler for building external interface (MEX) files:
Would you like mex to locate installed compilers [y]/n?
此时键入 ”y” ,按回车;
(c) 命令窗口出现如下提示:
Please choose your compiler for building external interface (MEX) files:
Would you like mex to locate installed compilers [y]/n? y
Select a compiler:
[1] Digital Visual Fortran version 6.0 in C:\Program Files\Microsoft Visual Studio
[2] Lcc C version 2.4 in C:\MATLAB6P5\sys\lcc
[3] Microsoft Visual C/C++ version 6.0 in C:\Program Files\Microsoft Visual Studio
[0] None
此时键入 ” 3” ,按回车;选择 Microsoft Visual C++6.0 的编译器
(d) 命令窗口出现如下提示:
Please verify your choices:
Compiler: Microsoft Visual C/C++ 6.0
Location: C:\Program Files\Microsoft Visual Studio
Are these correct?([y]/n):
此时键入 ”y” ,按回车;确认选择 Microsoft Visual C++6.0 的编译器
(3) mbuild 命令设置
(a) 运行 Matlab ,在 Matlab 的命令窗口 (Command Window) 键入“ mbuild -setup ”命令后,按回车键,安装 Matlab 编译器;
(b) 命令窗口出现如下提示:
Please choose your compiler for building standalone MATLAB applications:
Would you like mbuild to locate installed compilers [y]/n?
此时键入 ”y” ,按回车;
(c) 命令窗口出现如下提示:
[1] Lcc C version 2.4 in C:\MATLAB6P5\sys\lcc
[2] Microsoft Visual C/C++ version 6.0 in C:\Program Files\Microsoft Visual Studio
[0] None
此时键入 ” 2” ,按回车;选择 Microsoft Visual C++6.0 的编译器
(d) 命令窗口出现如下提示:
Please verify your choices:
Compiler: Microsoft Visual C/C++ 6.0
Location: C:\Program Files\Microsoft Visual Studio
Are these correct?([y]/n):
此时键入 ”y” ,按回车;确认选择 Microsoft Visual C++6.0 的编译器
(4) 在 Matlab 的命令窗口 (Command Window) 键入“ cd(prefdir); mccsavepath prefdir; ” 启动 MATLAB add-in 工具条 。MATLAB7.0,输入的是:cd(prefdir); savepath prefdir;就可以了,其他版本未知。
4.添加 mexFunction 函数代码
(1) 打开 sum_prod.def 文件,在“ EXPORTS ”后面(最后一行)加入 mexFunction 一行 ,声明 mexFunction 函数为导出函数,下面是编辑后的 sum_prod.def 文件内容
// 定义输入参数
#define P1 prhs[0]
#define P2 prhs[1]
// 定义输出参数
#define SUM plhs[0]
#define PROD plhs[1]
// 定义 C 运算函数
void SUM_PROD_RUN(double *sum,
double *prod,
double *p1,
double *p2,
int m1,
int n1)
{
// C 源程序代码
int i;
for (i=0;i
{
sum[i] = p1[i]+p2[i];
prod[i] = p1[i]*p2[i];
}
}
void mexFunction (int nlhs, mxArray *plhs[], // 输出参数个数,及输出参数数组
int nrhs, const mxArray *prhs[]) // 输入参数个数,及输入参数数组
{
int m1,n1,m2,n2;
double *p1,*p2,*sum,*prod;
// 取得输出矩阵的行列数
m1 = mxGetM(P1);
n1 = mxGetN(P1);
m2 = mxGetM(P2);
n2 = mxGetN(P2);
// 输入矩阵的行列数必须相等
if (m1!=m2||n1!=n2)
mexErrMsgTxt("The size of input matrix must be equal!\n");
// 为输出变量分配内存空间
SUM = mxCreateDoubleMatrix(m1,n1,mxREAL);
PROD = mxCreateDoubleMatrix(m1,n1,mxREAL);
// 取得输入参数指针
p1 = mxGetPr(P1);
p2 = mxGetPr(P2);
// 取得输出参数指针
sum = mxGetPr(SUM);
prod = mxGetPr(PROD);
// 调用 C 运算函数
SUM_PROD_RUN(sum,prod,p1,p2,m1,n1);
return;
}
(4) 编译链接程序后,可以在 Debug 目录得到 sum_prod.dll ,该 DLL 就是 Matlab 环境中可直接调用的 C 语言 mex 函数
mex 函数
5 、 mexFunction 函数调试
(1) 在 VC++6.0 中以 Debug 方式建立以上 sum_prod 工程
(2) 单击菜单 Project ,单击 Setting… 菜单项,出现 Project Setting 对话框,选择 Debug 标签, 在 Executable for debug session: 下面的文本框内容的后面加入 matlab.exe 的完整路径名
接 OK 按钮。
(3) 在 mexFunction 源程序中合适的 设置断点,然后按 F5 键进入调试过程 。
(4) 进入调试过程后,就会启动 一个新的 Matlab 程序,这个 Matlab 程序的当前目录为该工程所在的位置,为了运行 sum_prod.dll ,需要 将当前目录设置为 Debug 目录 。
(5) 在 Matlab 命令窗口调用 sum_prod.dll ,程序就会停在 VC++6.0 环境里的程序断点处。此时可以 在 Context 窗口中看到最近处理的变量数值 ,并可以 随意添加 Watch 。这样就可以像调试通常的 C 程序一样对 mex 程序进行调试。
7 、 mexFunction 函数测试
(1) 运行 Matlab6.5 ,将 sum_prod.dll 复制到 Matlab 当前目录
(2) 在 Matlab6.5 命令窗口输入以下代码
“ p1=[1 2;3 4];p2=[5 6;7 8];[sum,prod]=sum_prod(p1,p2) ”
按回车键,得到
sum =
6 8
10 12
prod =
5 12
21 32
表明 sum_prod.dll 测试成功!