2009年4月16日星期四

如何将Matlab6.5函数转换成VC++6.0函数(转)

来自这里

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 、建立 C++ 控制台工程

(1) 新建一个 C++ 控制台工程 Test

其它都采用默认设置。然后在该工程中添加 Test.cpp 文件

4 、启用 Matlab Add-in 工具条

(1) 在上面的 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 文件复制到该 Test 工程所在的目录下

(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 、 C++ 函数的使用

在上面 VC 工程 Test.cpp 文件中键入以下代码:

//********************************************************************

#include "matlab.hpp" // 包含类 mwArray 定义

#include "sum_prod.hpp" // 包含 C++ 函数 sum_prod

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;

// 初始化与 C++ 数组相对应的 mwArray 变量

mwArray X(2,3,x);

mwArray Y(2,3,y);

mwArray SUM,PROD;

// 调用 C++ 函数

SUM = sum_prod(&PROD,X,Y);

// 给输出数据分配内存

sum =(double*) calloc(6,sizeof(double));

prod =(double*) calloc(6,sizeof(double));

// 取出输出数据

sum = mxGetPr(SUM.GetData());

prod = mxGetPr(PROD.GetData());

// 输出显示

cout << "SUM = " <<>

for (i=0;i<2;i++)

{

for (j=0;j<3;j++)

cout <<>

cout <<>

}

cout << "PROD = " <<>

for (i=0;i<2;i++)

{

for (j=0;j<3;j++)

cout <<>

cout <<>

}

// 释放内存

free(sum);

free(prod);

}

//********************************************************************

编译链接程序 , “忽略”编译过程中有关库文件 msvcrt.lib 的警告。

该 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];

因此才能得到上图的结果

特别说明二:

通过 Matlab Add-in 实现 Matlab 与 VC++ 的混合编程也有不足, 并不是所有的 Matlab 的函数都能转成 C++ 函数 ,这一点在使用过程中要特别注意 !

8 、程序的发布

(1) 使用 VC 附带的 Depends 工具找到应用程序所需要的 dll 文件,手动复制这些文件添加到应用程序所在的目录即可。

(2) 编译好的程序只要 附带 mglarchive.exe ( 在 C:\MATLAB6p5\extern\lib\win32 目录 ) 中的数学和图形库即可在没装 matlab 的机器上运行

没有评论:

发表评论