见百度文库:
http://wenku.baidu.com/view/3427724fe45c3b3567ec8b4b.html###
为避免链接失效,将其文档全文粘贴在此:
MATLAB调用C++动态库的方法
声明:本人知识水平有限,文档中难免有错,望谅解!
一、方法步骤
1、 首先确定你的动态库正确,并将你的动态库(例如:Demo.dll)和静态链接库
(Demo.lib)和自定义的相关头文件(例如:Demo.h等)拷贝到当前工作目录下,
当然也可以将你的动态库拷贝到C盘的windows\system32目录下。
2、 写.cpp文件,并用mex命令生成.mexw64或者.mexw32文件(这由你的系统决定),
其实,这个文件起转换作用。也就是说,你用MATLAB调用C++动态库就必须通过这个文件去调用,而这个文件就是由.cpp文件生成的。
这个.cpp文件中必须包含这个mexFunction函数,格式也必须如下: void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) nlhs:输出参数个数 plhs:输出参数列表 nrhs:输入参数个数 prhs:输入参数列表
不过函数名可以随便取的。在这个函数中你就可以去调用C++动态库的函数了。 记住头文件:”mex.h” ……
注意:保存的文件名就是将来在MATLAB中调用的函数名,而不是这里的函数名。
3、 使用mex命令编译XXX.cpp。如:mex xxx.cpp ;那么系统将生成xxx.mexw32或者xxx.mexw64
文件。这个文件的文件名就将是你要调用的函数名; 4、 现在就可以写脚本调用这个函数了。
二、案例
1、现在生成了一个C++动态库Demo.dll\Demo.lib,还有头文件Demo.h;里面定义了一个函数 double Demo_Add( double x, double y); //功能:将两个数相加并返回 这些大家都知道,不用我说了吧。 2、在MATLAB中写一个c++文件Test.cpp:
#include "mex.h" #include "Demo.h"
#pragma comment(lib,"Demo.lib")
void mexFunction(int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[])
{
if( nrhs != 2) //判断输入参数的个数
{
mexErrMsgTxt("输入参数个数不对!");
}
//得到传入的第一个参数,并转换了double类型 double p1 = *((double*)mxGetPr(prhs[0])); //得到传入的第二个参数,并转换了double类型 double p2 = *((double*)mxGetPr(prhs[1]));
//创建一个1*1的实时double类型的矩阵
plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL); //得到输出的第一个参数的指针
double *output = (double*)mxGetPr(plhs[0]);
//调用Demo.dll定义的函数实现功能,并将返回值给输出参数
*output = DEMO_Add(p1, p2);
}
3、在当前工作目录下只用mex Test.cpp编译,编译成功将生成MEX文件,Test.mexw32
或者Test.mexw64.
5、 那么现在你就可以通过Test这个函数名去调用Demo_Add函数了.
我现在就写一个脚本文件First.m: clc clear tic
x = 1.6; y = 2.7;
Test_add = Test(x, y)
toc
6、run这个脚本.MATLAB调用C++动态库就成功了….
Author : Li Jun
Date :2012-03-26