视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
matlab与vc混合编程(绝对无误)
2025-09-25 14:13:20 责编:小OO
文档
matlab与vc混合编程

1、环境设置

在桌面上右键单击“我的电脑”图标出现以下菜单

单击“属性”菜单项,出现“系统特性”对话框,单击“高级”选项卡,如下图所示

在上图中,单击“环境变量”按钮,出现“环境变量”对话框, 添加系统变量 matlab 值为 D:\\MATLAB 即 matlab 的安装路径,如下图所示

在环境变量 path 中加入 D:\\MATLAB\\bin\\win32 ,如下图所示

按“确定”完成设置后, 重启计算机或注销当前用户 ,即可应用新设置。

2、matlab 编译器设置

(1) mex 命令设置

(a) 运行 matlab ,在 matlab 的命令窗口 (Command Window) 键入“ mex -setup ”命令后,按回车键,安装 matlab 编译器;

(b) 命令窗口出现如下提示

mex -setup

Please choose your compiler for building external interface (MEX) files: 

Would you like mex to locate installed compilers [y]/n? 

此时键入 ”y” ,按回车;

(c) 命令窗口出现如下提示

Select a compiler: 

[1] Digital Visual Fortran version 6.0 in C:\\Program Files\\Microsoft Visual Studio 

[2] Lcc C version 2.4.1 in D:\\MATLAB\\sys\\lcc 

[3] Microsoft Visual C/C++ version 6.0 in C:\\Program Files\\Microsoft Visual Studio 

[4] Open WATCOM C/C++ version 1.3 in D:\\Maple11 

[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 的编译器

(2) mbuild 命令设置

(a) 运行 matlab ,在 matlab 的命令窗口 (Command Window) 键入“ mbuild -setup ”命令后,按回车键,安装 matlab 编译器;

(b) 命令窗口出现如下提示

mbuild -setup

Please choose your compiler for building standalone MATLAB applications: 

Would you like mbuild to locate installed compilers [y]/n? 

此时键入 ”y” ,按回车;

(c) 命令窗口出现如下提示

Select a compiler: 

[1] Lcc C version 2.4.1 in D:\\MATLAB\\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 的编译器,编译器设置完成。

3、编写matlab 函数

函数文件 sum_prod.m ,内容如下:

function [sum,prod] = sum_prod(p1,p2)

sum = p1+p2; % p1 与 p2 的和

prod = p1.*p2; % p1 与 p2 的点乘

该函数完成的是矩阵的求和与点乘的功能,下面将介绍把该代码转换成 VC++ 环境可用的代码的方法。

4、将 matlab 函数转成 dll 文件

在 Matlab7.0 的 Command Window 下输入命令 :

命令  : mcc -W lib:libsum_prod -T link:lib sum_prod.m –v

其中libsum_prod是需要生成的各种文件的名称,sum_prod.m为matlab函数。生成动态链接库 dll ,编译完成后, matlab 生成一些文件,其中

libsum_prod.ctf

libsum_prod.dll

libsum_prod.h

libsum_prod.lib

这些文件是我们后面需要用到的。

注意 : 该命令生成的 dll 文件接口的数据类型是 mxArray

5、VC++6.0 工程的创建与设置

(1)建立一个名为 Test 基于 MFC的单文档应用程序

添加一个新的菜单项及其子菜单

按Ctrl+W快捷键,在MFC ClassWizard中为资源ID_SUMPROD配置消息COMMAND(注意是在CMainFrame类中), 选择ADD FUNCTION,点击OK,出现OnSumprod()成员函数。

在资源视图中,插入新的对话框,添加如下的对话框,其中“运算”为删掉OK按钮后的新控件,并在MFC ClassWizard为“运算”添加响应函数OnCalculate()。

建立以该对话框为资源的对话框类,命名为CCalculate,并为各编辑框控件映射成员变量。

在MainFrm.cpp文件添加头文件#include "Calculate.h",并为OnSumprod()成员函数添加代码

void CMainFrame::OnSumprod() 

{

    // TODO: Add your command handler code here

    CCalculate dlg;

    dlg.DoModal();

}

(2)对 VC ++ 6.0 ,进行以下设置

单击菜单 Tools ,出现如下菜单

单击 Options… 菜单项,出现 Options 对话框,选择 Directories 标签,在 include files 里面加入:

D:\\MATLAB\\EXTERN\\INCLUDE

在 Library files 里面加入:

D:\\MATLAB\\EXTERN\\LIB\\WIN32\\MICROSOFT\\MSVC71

最后的MSVC71以安装的matlab版本为准(本文版本为matlab7.1)。

(3) 对该工程,进行以下设置

单击菜单 Project,选择 Setting… 菜单项,出现 Project Setting 对话框,选择 Link 标签,在 Object/library modules: 下面的文本框内容的后面加入 mclmcrrt.lib 

libsum_prod.lib ,如下图所示

6、代码编辑及 dll调用

(1)将前面生成的四个文件:

libsum_prod.ctf

libsum_prod.dll

libsum_prod.h

libsum_prod.lib

复制到 VC 工程所在目录。

(2) 在 VC ++ 6.0 环境中, 单击菜单 Project , 选择 Add to Project 菜单项,再单击 Files… 子菜单项,出现如下图对话框,

将 libsum_prod.h 加入到当前工程中。

(3) 在Calculate.cpp 中添加以下代码:

void CCalculate::OnCalculate() 

{

    // TODO: Add your control notification handler code here

      //调用动态链接库

    if(!libsum_prodInitialize())

    {

        MessageBox("加载库失败!");

    }

    // 声明 DLL 函数输入输出 mxArray 对象

    mxArray *X,*Y;

mxArray *SUM=NULL,*PROD=NULL;

    // 给输入 mxArray 对象分配内存

    X = mxCreateDoubleMatrix(1,1,mxREAL);

Y = mxCreateDoubleMatrix(1,1,mxREAL); 

 

    // 给输入 mxArray 对象赋值

    double p1[1][1], p2[1][1]; //必需以数组形式

    UpdateData();

    p1[0][0] = m_p1;

    p2[0][0] = m_p2;

    memcpy(mxGetPr(X),p1,sizeof(double));

memcpy(mxGetPr(Y),p2,sizeof(double));

    // 调用 DLL 函数,注意输入与输出的接口是不同的

mlfSum_prod(2,&SUM,&PROD,X,Y) ;

    // 返回mxArray 对象值

    double *p3, *p4; //必需以指针形式

    p3 = mxGetPr(SUM);

    p4 = mxGetPr(PROD);

    m_p3 = p3[0];

    m_p4 = p4[0];

UpdateData(false);

    // 释放输入输出 mxArray 对象所占用的内存

    // 注意输出对象的内存是在调用 DLL 函数过程中分配的

    mxDestroyArray(X);

    mxDestroyArray(Y);

    mxDestroyArray(SUM);

    mxDestroyArray(PROD);

}

编译,链接,运行,最终结果如下。下载本文

显示全文
专题