Matlab与C/C++混合编程接口及应用

[09-12 18:33:18]   来源:http://www.88dzw.com  EDA/PLD   阅读:8803

文章摘要:b.在VC 中新建一个基于对话框的MFC 应用程序Test2,添加一个按钮,并添加按钮响应函数,函数内容见f 步。将上面生成的两个文件拷贝到VC 工程的Test2 目录下。c.在VC 中选择:工程->设置,选择属性表Link 选项,下拉菜单中选择Input,在对象 / 库模块中加入libmmfile.lib libmatlb.lib libmx.lib libmat.lib libmatpm.lib sgl.lib libmwsglm.lib libmwservices.lib , 注意用空格分开; 而在忽略库中加入 msvcrt.lib;d.选择属性表C/C++选项,下拉菜单选Gene

Matlab与C/C++混合编程接口及应用,标签:eda技术,eda技术实用教程,http://www.88dzw.com

  b.在VC 中新建一个基于对话框的MFC 应用程序Test2,添加一个按钮,并添加按钮响应函数,函数内容见f 步。将上面生成的两个文件拷贝到VC 工程的Test2 目录下。

  c.在VC 中选择:工程->设置,选择属性表Link 选项,下拉菜单中选择Input,在对象 / 库模块中加入libmmfile.lib libmatlb.lib libmx.lib libmat.lib libmatpm.lib sgl.lib libmwsglm.lib libmwservices.lib , 注意用空格分开; 而在忽略库中加入 msvcrt.lib;

  d.选择属性表C/C++选项,下拉菜单选General,在预处理程序定义中保留原来有的内 容,并添加MSVC,IBMPC,MSWIND,并用逗号隔开。选择下拉菜单的Precompiled Headers 选 项,在“自动使用预补偿页眉”中添加stdafx.h,然后确定。

  e. 选择: 工具-> 选项, 属性页选择“ 目录” , 在include files 加入: C:\MATLAB6p5p1\extern\include , C:\MATLAB6p5p1\extern\include\cpp ; 然后在 Library files 里面加入: C:\MATLAB6p5p1\bin\win32 , C:\MATLAB6p5p1\extern\ lib\win32\microsoft\msvc60;注意根据用户的Matlab 安装位置,修改相应目录。

  f.在响应函数中添加头文件:#include "matlab.hpp" #include "example3.hpp" 函数响应代码为:

  int i; mwArray n; n=10; n=example3(n); i=n.ExtractScalar(1);

  CString str; str.Format("example3 的返回值是:%d",i); AfxMessageBox(str);

  g. 编译,连接,执行,结果如图2 所示。


  3.3 利用mcc 编译器生成的的DLL 文件

  Matlab的C++ Complier不仅能够将Matlab的m文件转换为C/C++的源代码,还能产生完全 脱离Matlab运行环境的独立可执行DLL程序。从而可以在C/C++程序中,通过调用DLL实现对 Matlab代码的调用。下面通过一个简单的例子说明C/C++调用m文件生成的DLL:

  a.建立m文件example4.m: function result=example4(para)

  x=[1 para 3]; y=[1 3 1]; plot(x,y); result=para*2; end.然后在命令窗口中输入:

  mcc -t -W libhg:example4 -T link:lib -h libmmfile.mlib libmwsglm.mlib example4则在工作目录下会生成example4 .dll、example4 .lib和example4 .h三个文件。

  b.在VC中新建一个基于对话框的应用程序Test3,然后添加一个按钮及按钮响应函数,函数内容见d步,再将生成的3个文件拷贝到Test2工程目录下。

  c.VC编译环境的设置如同3.2节c、d步;

  d.在按钮函数文件添加如下的头文件:#include "example4 .h" ,函数响应代码为:

  mxArray* para=mxCreateDoubleScalar(2); mxArray* result; example4Initialize();

  result=mlfExample4(para); CString str;

  str.Format("%f",mxGetScalar(result)); AfxMessageBox(str);

  e.编译,连接,执行,结果如图3所示。


  利用mcc 编译器生成的DLL 动态连接库文件,只需在C/C++编译环境中将其包含进来, 调用导出函数即可实现原m 文件的功能,极大地方便了用户的代码设计。

  4 结束语

  本文从Matlab 调用C/C++代码和C/C+调用m 文件两方面,详细地研究了Matlab 与C/C++ 混合编程技术。对于Matlab 调用C/C++代码,给出了常用的MEX 技术和调用C/C++动态连接 库的方法,并对它们进行比较。针对用户在实际中经常遇到的C/C++调用Matlab 问题,通过研究给出了常用的三种方法及其特点:利用Matlab 计算引擎的方法,混合编程后的可执 行程序脱离不了Matlab 的运行环境,运行速度很慢;利用mcc 编译器将m 文件转化为C/C++ 文件的方法,虽然能独立于Matlab 运行环境,可在C/C++环境中包含生成的文件非常繁琐; 但是m 文件生成的DLL 为用户提供了一种简洁方便的C/C++调用Matlab 代码的方法。除 Matlab 自带的mcc 外,Matcom 也能将M 文件编译为C/C++文件和DLL 文件[2][8],但混合编程 原理一样,在此省略。


上一页  [1] [2] [3] 


Tag:EDA/PLDeda技术,eda技术实用教程EDA/PLD
分类导航
最新更新
热门排行