如何将Matlab6.0函数转换成C++动态链接库doc

shaoliying 贡献于2012-07-31

作者 ChenFeng  创建于2009-11-22 13:27:00   修改者ChenFeng  修改于2009-11-22 13:31:00字数5043

文档摘要:如何将Matlab6.0函数转换成C++动态链接库
关键词:

如何将Matlab6.0函数转换成C++动态链接库 作者:陆振波 单位:海军工程大学 电子邮件: luzhenbo@yahoo.com.cn 个人主页: http://luzhenbo.88uu.com.cn/ 1 、编写 Matlab 函数 函数文件 sum_prod.m ,内容如下: function [sum,prod] = sum_prod(p1,p2) sum = p1+p2; % p1 与 p2 的和 prod = p1.*p2; % p1 与 p2 的点乘 该函数完成的是矩阵的求和与点乘的功能,下面将介绍把该代码转换成 C++ 环境可用的代码的方法。 2 、 Matlab6.5 编译器设置 (1) 在同一台电脑上安装 Matlab6.5 和 Visual C++6.0 ; (2) 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 工具条 3 、建立 MFC 动态链接工程 (1) 建立一个名为 Sample 的 MFC 动态链接工程 ,如下图所示,其它选项按默认设置。 (2) 在 Sample 目录下会生成 Sample.cpp 和 Sample.h 这两个文件。 4 、启用 Matlab Add-in 工具条 在上面的 VC 工程中,在菜单栏的空白处右键单击鼠标,出现如下菜单 点击 Coustomize… 菜单项,出现如下 Coustomize 对话框, 选择 Add-in and Macro Files 标签,选中 MATLAB Add-in 选项,点 Close 按钮关闭对话框,这里会在菜单附近出现如下工具条,它就是 Matlab Add-in 工具条。 5 、 VC++6.0 环境及工程设置 在上面的 VC 工程中,进行以下设置 (1) VC++6.0 环境设置 单击菜单 Tools ,出现如下菜单 单击 Options… 菜单项,出现 Options 对话框,选择 Directories 标签,在 include files 里面加入: C:\MATLAB6P5\EXTERN\INCLUDE C:\MATLAB6P5\EXTERN\INCLUDE\CPP 如下图所示 在 Library files 里面加入: C:\MATLAB6P5\EXTERN\LIB C:\MATLAB6P5\EXTERN\LIB\WIN32 C:\MATLAB6P5\EXTERN\LIB\WIN32\MICROSOFT\MSVC60 如下图所示 (2) VC++6.0 工程设置 单击菜单 Project ,出现如下菜单 单击 Setting… 菜单项,出现 Project Setting 对话框,选择 Link 标签,在 Object/library modules: 下面的文本框内容的后面加入 libmmfile.lib libmatlb.lib libmx.lib libmat.lib libmatpm.lib sgl.lib libmwsglm.lib libmwservices.lib ,如下图所示 选择 C/C++ 标签,在 Prerocessor definitions: 下面的文本框内容的后面加入 ,MSVC,IBMPC,MSWIND ,如下图所示 设置完成。 6 、 Matlab 到 C++ 的代码转换 在上面的 VC 工程中 (1) 将前面 sum_prod.m 文件复制到该 Sample 工程所在的目录下 (2) 单击 Matlab Add-in 工具条最左边第一个按钮,出现如下对话框 选中 Windows Console EXE 四个选择选中后二项,如上图所示,单击 OK ,出现如下对话框 选中 Matlab 函数文件 sum_prod.m ,单击“打开”按钮,这样在该工程所在的目录就生成了 sum_prod.cpp 和 sum_prod.hpp 文件。 (3) 打开 sum_prod.cpp 文件,注意到里面有这样一个函数 mwArray sum_prod(mwArray * prod, mwArray p1, mwArray p2) {…} 可以看到在 C++ 环境中, sum_prod 也是一个函数,它的输入与输出数据类型是 mwArray ,它是 VC6.0 专门为 Matlab 中的矩阵对象定义的一个类。函数 sum_prod 有三个输入参数和一个输出参数。由于 C++ 函数不能有一个以上的返回值,因此这里将 Matlab 函数 sum_prod 的第二个返回值,以地址型变量的形式作为 C++ 函数 sum_prod 的第一个输入参数。 7 、生成 MFC 动态链接函数 在上面的 VC 工程中 (1) 打开 Sample.cpp 文件; (2) 在 Sample.cpp 头部加入以下代码: #include "matlab.hpp" // 包含类 mwArray 定义 #include "sum_prod.hpp" // 包含 C++ 函数 sum_prod (3) 在 Sample.cpp 尾部加入以下代码: // 声明函数 SUM_PROD 为导出函数。 extern "C" __declspec(dllexport) void SUM_PROD(double *sum, double *prod, double *x, double *y, int rows, int cols) { // MFC DLL 导出函数的开头要加这一行 AFX_MANAGE_STATE(AfxGetStaticModuleState()); // 初始化与 C++ 数组相对应的 mwArray 变量 mwArray X(rows,cols,x); mwArray Y(rows,cols,y); mwArray SUM,PROD; // 调用 C++ 函数 SUM = sum_prod(&PROD,X,Y); // 取出输出数据 memcpy(sum,mxGetPr(SUM.GetData()),rows*cols*sizeof(double)); memcpy(prod,mxGetPr(PROD.GetData()),rows*cols*sizeof(double)); } (4) 直接按快捷键 F7 或下面工具栏的第 2 个按钮编译链接程序, “忽略”编译过程中有关库文件 msvcrt.lib 的警告。 就在 Sample 目录或是 Sample\Debug 目录下生成了 Sample.dll 、 Sample.lib 这两个文件。 8 、 C++ 环境测试 MFC 动态链接函数 (1) 新建一个 C++ 控制台工程 Test 其它都采用默认设置。然后在该工程中添加 Test.cpp 文件 (2) 将前面生成的 Sample.dll 、 Sample.lib 文件,复制到 Test 目录下 。 (3) 单击菜单 Project ,出现如下菜单 单击 Setting… 菜单项,出现 Project Setting 对话框,选择 Link 标签,在 Object/library modules: 下面的文本框内容的后面加入 Sample.lib 如下图所示,然后单击 OK 按钮。 (4) 在 Test.cpp 键入以下代码: #include #include #pragma comment(lib,"Sample.lib") // 加载 DLL 库文件 // 声明外部函数 SUM_PROD extern "C" __declspec(dllimport) void SUM_PROD(double *sum, double *prod, double *x, double *y, int rows, int cols); void main() { int i,j; // 定义 C++ 二维数组 double x[] = {1,2,3,4,5,6}; double y[] = {7,8,9,10,11,12}; double *sum,*prod; // 给输出数据分配内存 sum =(double*) calloc(6,sizeof(double)); prod =(double*) calloc(6,sizeof(double)); // 调用 DLL 函数 SUM_PROD(sum,prod,x,y,2,3); // 输出显示 cout << "SUM = " << endl; for (i=0;i<2;i++) { for (j=0;j<3;j++) cout << sum[j*2+i] << "\t"; cout << endl; } cout << "PROD = " << endl; for (i=0;i<2;i++) { for (j=0;j<3;j++) cout << prod[j*2+i] << "\t"; cout << endl; } // 释放内存 free(sum); free(prod); } 该 C++ 程序运算结果如下图所示 特别说明一: 在 C\C++ 环境中二维数组是“行向量” ,如果将下面定义的变量 x 看成二维数组的话 double x[] = {1,2,3,4,5,6}; 那么 x 应该是 的矩阵,即 x = [1,2,3; 4,5,6]; 但是,如果将数组首地址 x 初始化 mwArray 类时, 数组 x 在 mwArray 中是按“列向量”的形式排列 的,即 X = [1,3,5; 2,4,6]; 同理,这里 Y = [7,9,11; 8,10,12]; 因此才能得到上图的结果 特别说明二: 当在 VC++6.0 环境以外运行可执行文件 Test.exe 时,最好将前面生成的动态链接库文件 Sample.dll 复制到包含 exe 文件的目录   特别说明三: 通过 Matlab Add-in 实现 Matlab 与 VC++ 的混合编程也有不足, 并不是所有的 Matlab 的函数都能转成 C++ 函数 ,这一点在使用过程中要特别注意 !

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享文档获得金币 ] 0 人已下载

下载文档