首页 Matlab与C_C++混合编程技术研究

Matlab与C_C++混合编程技术研究

举报
开通vip

Matlab与C_C++混合编程技术研究 潘大夫,汪渤,周志强:Matlab与 C/C++混合编程技术研究 2009,30 (2) 465 0 引 言 Matlab是当前应用最为广泛的数学软件,具有非常强大 的数值计算、数据分析处理、系统分析、图形显示甚至符号运 算等功能 [1]。它为用户提供了一种比其它工具更为简洁、自 由、可移值性好的编程环境。利用这一完整的数学平台,用户 可以快速实现十分复杂的功能,极大地提高工程分析计算的 效率 [2-3]。但与其它高级程序[4]相比,Matlab程序是一种解释执 行程序,不用编译等预处理,因此Matlab程序...

Matlab与C_C++混合编程技术研究
潘大夫,汪渤,周志强:Matlab与 C/C++混合编程技术研究 2009,30 (2) 465 0 引 言 Matlab是当前应用最为广泛的数学软件,具有非常强大 的数值计算、数据分析处理、系统分析、图形显示甚至符号运 算等功能 [1]。它为用户提供了一种比其它工具更为简洁、自 由、可移值性好的编程环境。利用这一完整的数学平台,用户 可以快速实现十分复杂的功能,极大地提高工程分析计算的 效率 [2-3]。但与其它高级程序[4]相比,Matlab程序是一种解释执 行程序,不用编译等预处理,因此Matlab程序运行速度较慢[1]。 C/C++语言是目前最为流行的高级程序设计语言之一[4-5]。 它可对操作系统和应用程序以及硬件进行直接操作,C/C++语 言明显优于其它解释型高级语言,一些大型应用软件如Matlab 就是用C语言开发的。在工程实践中,用户有时需要在Matlab 环境中调用已编写的 C/C++代码,有时需要在 C/C++中调用 Matlab编写的数值处理、矩阵运算等代码,这就产生了Matlab 和 C/C++混合编程的问题。因此,本文基于常用的Matlab6.5 和 VC6.0开发环境,在Windows平台下就它们之间的混合编 程问题从Matlab调用 C/C++和 C/C++调用Matlab两方面进行 深入研究并举例说明。 1 配置Matlab编译环境 在Matlab与 C/C++混合编程之前,必须先对Matlab的编 译应用程序 mex和编译器 mbuild进行正确的设置 [1]: 对Matlab编译应用程序 mex的设置: Mex -setup 然后按系统提示进行选择。 对Matlab编译器 mbuild的设置: Mbuild -setup 同样,按后面提示选择即可。 2 Matlab调用 C/C++ Matlab调用 C/C++的方式主要有两种:利用MEX技术和 调用 C/C++动态连接库。 2.1 调用 C/C++的MEX文件 MEX是Matlab Executable的缩写,它是一种“可在Matlab 中调用的 C(或 Fortran)语言衍生程序”[6]。即MEX文件的源码 是由 C或 Fortran语言编写的;后经Matlab编译器处理而生成 的二进制文件;它是可以被 Matlab解释器自动装载并执行的 收稿日期:2008-01-13 E-mail:pandaful@bit.edu.cn 基金项目:国家部委预研基金项目 (51405030104BQ0171)。 作者简介:潘大夫 (1980-),男,陕西汉中人,博士研究生,研究方向为目标识别与跟踪; 汪渤,博士,教授,研究方向为精确制导技术;周 志强,博士研究生,研究方向为地面目标识别与跟踪。 Matlab与 C/C++混合编程技术研究 潘大夫, 汪 渤, 周志强 (北京理工大学 信息科学技术学院自动控制系,北京 100081) 摘 要:Matlab具有强大的数值计算和分析等能力,而 C/C++是目前最为流行的高级程序设计语言,两者互补结合的混合编 程在科学研究和工程实践中具有非常重要的意义。因此,从Matlab调用 C/C++代码及 C/C++调用 m文件两方面,深入地研究 了它们之间混合编程的原理和实现机制,并且给出了具体条件下的混合编程方法和步骤。实例 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 明,提出的Matlab与 C/C+ +混合编程方法是简洁、有效的。 关键词:Matlab; C/C++; 混合编程; 计算引擎; MEX; DLL 中图法分类号:TP391 文献标识码:A 文章编号:1000-7024 (2009) 02-0465-04 Research on mixed programming technology of Matlab and C/C++ PAN Da-fu, WANG Bo, ZHOU Zhi-qiang (Department of Automatic Control, School of Information Science and Technology, Beijing Institute of Technology, Beijng 100081, China) Abstract:Matlab has strong ability of numerical value calculation and analysis, whereas C/C++ is one of the most popular programming languages. And the mixed programming of Matlab and C/C++ is significant in scientific research and engineering applications. Therefore, the mechanism of Matlab inducing C/C++ codes and C/C++ calling m file are proposed separately. The mixed programming methods and approaches in different conditions are also presented. At last, the validity of the mixed programming between Matlab and C/C++ is testified with some examples. Key words:Matlab; C/C++; mixed programming; compution engineer; MEX; DLL1 计算机应用 计算机工程与设计 Computer Engineering and Design 466 2009,30 (2) 计算机工程与设计 Computer Engineering and Design 动态连接程序。MEX 文件的使用极为方便,其调用方式与 Matlab的内建函数完全相同,只需在Matlab命令提示符下键 入MEX文件名即可。因此,对于大量现有的 C/C++代码可无 须改写成Matlab专用的 m文件而在Matlab中执行;对于那些 Matlab运算速度过慢的算法,可以调用 C语言编写的相应代 码,从而提高效率。 要实现 C/C++文件到MEX文件转换,必须在Matlab编译 应用程序 mex的设置中选择 VC编译器。一个 C/C++的MEX 源程序通常包括 4个组成部分,其中前 3个是必须包含的内 容,第 4个则根据所实现的功能灵活选用: (1)#include“mex.h”; (2) MEX文件的入口函数 mexFunction,MEX文件导出名 必须为 mexFunction函数; (3)mxArray; (4)API函数。 下面通过一个简单的例子说明 C/C++的 MEX 源程序编 写和调用过程: #include "mex.h" void timestwo(double y[], double x[]) { y[0] = 2.0*x[0]; } /*下面这个 mexFunction 的目的是使 Matlab 知道如何调 用这个 timestwo函数*/ void mexFunction (int nlhs, mxArray *plhs [], int nrhs, const mxArray *prhs[]) /* nlhs是Matlab命令行方式下输出参数的个数;plhs[]是 输出参数;nrhs是输入参数的个数;prhs[]是的输入参数;*/ { double *x,*y; int mrows,ncols; if(nrhs!= 1) { mexErrMsgTxt("One input required."); } else if(nlhs>1) { mexErrMsgTxt("Too many output arguments"); } mrows = mxGetM(prhs[0]); ncols = mxGetN(prhs[0]); if(! mxIsDouble(prhs[0]) || mxIsComplex(prhs[0]) || !(mrows == 1 && ncols == 1)) { mexErrMsgTxt("Input must be a noncomplex scalar double."); } plhs[0] = mxCreateDoubleMatrix(mrows,ncols,mxREAL); x = mxGetPr(prhs[0]); y = mxGetPr(plhs[0]); timestwo(y,x); } 用指令mex timestwo.c编译此文件,然后在Matlab命令行 下调用生成的MEX文件: >>x = 2; >>y = timestwo(x) >>y = 4 现在常用的 C语言编译器也能够编译 C++程序,使用这 些编译器,通过 mex命令就可实现 C++语言的 MEX文件。和 C语言MEX一样,C++语言MEX文件也必须实现和导出MEX 文件入口函数。在这两种语言的MEX文件中,mexFunction的 定义是完全一样的,只是在 C++函数体内可以使用或调用其 它 C++语言函数。 在Matlab上运行MEX不需要任何工具箱。使用MEX文 件的优点是代码重用、速度提升经及功能扩展。 2.2 调用 C/C++动态连接库 从Matlab6.5(R13)起,Matlab提供了对动态连接库 DLL文 件的接口 [7]。利用这个接口,可以在 Matlab中调用动态连接库 所导出的函数。Matlab对 DLL的接口支持以各种编程语言编 写的 DLL文件。在调用 DLL文件中的功能之前,需要准备包 含函数定义的 C语言头文件。对于 C/C++语言开发的 DLL文 件,可使用源程序中相应的头文件;而对于用其它语言开发的 DLL,则需要手工准备等效的 C语言函数定义头文件。 在Matlab中利用动态连接库接口技术通常需要完成以下 4个步骤: (1)打开动态连接库文件; (2)为调用函数准备数据; (3)调用动态连接库文件中导出的函数; (4)关闭动态连接库文件。 为了完成以上步骤,常用到的Matlab函数有:loadlibrary, loadlibrary,calllib,libfunctions,lipointer,libstruct,libisloaded。 下面通过例子说明Matlab调用 C/C++ 动态连接库的方法和步骤: (1)在 VC环境下,新建工程->win32动态连接库->工程名 Test1->empty工程->完成。 (2)新建->C++源文件->添加 a.cpp,内容如下: #include "a.h" _declspec(dllexport) int add(int a, int b) { return a+b; } (3)新建->C/C++头文件->添加 a.h,内容如下: _declspec(dllexport) int add(int a,int b); 然后编译生成Test1.dll动态连接库文件,将Test1.dll和 a.h 拷贝到 Matlab工作目录下。 (4)在Matlab命令行下,调用 Test.dll: >>loadlibrary(‘Test1’,’a.h’); >>x = 7; >>y = 8; >>calllib(‘Test1’,‘add’,x,y) 潘大夫,汪渤,周志强:Matlab与 C/C++混合编程技术研究 2009,30 (2) 467 Ans = 15 >>unloadlibrary(‘Test1’) 调用 DLL动态连接库的方法,为Matlab重用科研实践中 积累的大量实用 C/C++代码提供了一种简洁方便的方法。与 调用MEX文件相比,该方法更加简便实用。 3 C/C++调用Matlab 在工程实践中,C/C++调用Matlab的方法主要有调用Mat- lab计算引擎、包含 m文件转换的 C/C++文件,以及调用 m文 件生成的 DLL文件。 3.1 利用Matlab计算引擎 Matlab的引擎库为用户提供了一些接口函数[7-8],利用这些 接口函数,用户可在自己的程序中以计算引擎方式调用Matlab 文件。该方法采用客户机/服务器的计算方式,利用Matlab引 擎将Matlab和 C/C++联系起来。在实际应用中,C/C++程序为 客户机,Matlab作为本地服务器。C/C++程序向Matlab计算引 擎传递命令和数据信息,并从Matlab计算引擎接收数据信息。 Matlab提供了以下几个C语言计算引擎访问函数供用户 使用 [2,8]:engOpen,engClose,engGetVariable,engPutVariable,eng- EvalString,engOutputBuffer,engOpenSingleUse,engGetVisible, engSetVisible。 下面以 C 语言编写的调用 Matlab 引擎计算方程 3 2 + 5 = 0根的源程序 example2.c为例,说明 C/C++调用Matlab计算 引擎编程的原理和步骤: #include #include #include #include "engine.h" int PASCAL WinMain (HANDLE hInstance, HANDLE hPrevInstance,LPSTR lpszCmdLine, int nCmdShow) { Engine *ep; mxArray *P = NULL,*r = NULL; char buffer[301]; double poly[4] = {1,0,-2,5}; if (!(ep = engOpen(NULL))) { fprintf(stderr,"\nCan't start MATLAB engine\n"); return EXIT_FAILURE;} P = mxCreateDoubleMatrix(1,4,mxREAL); mxSetClassName(P,"p"); memcpy((char *)mxGetPr(P),(char *)poly, 4*sizeof(double)); engPutVariable(ep,P); engOutputBuffer(ep,buffer,300); engEvalString(ep,"disp(['多项式 ',poly2str(p,'x'),'的根 ']), r = roots(p)"); MessageBox(NULL,buffer,"example2展示MATLAB引 擎的应用",MB_OK); engClose(ep); mxDestroyArray(P); return EXIT_SUCCESS; } 在Matlab下运行 example2.exe: mex -f example2.c exmaple2.exe的运行结果如图 1所示。 以上是用Matlab自带的编译应用程序mex对 Example2.c 编译的。C/C++源程序也可在当前流行的 VC 开发环境下编 译:将 libeng.lib和 libmx.lib两个静态链接库加入当前工程,选 择 Project菜单的 Settings项,在“link/object/library modules”中 填入两个静态链接库的完整目录即可。 利用计算引擎调用Matlab的特点是:节省大量的系统资 源,应用程序整体性能较好,但不能脱离 Matlab的环境运行, 且运行速度较慢,但在一些特别的应用(例如需要进行三维图 形显示)时可考虑使用。 3.2 利用 mcc编译器生成的 cpp和 hpp文件 从Matlab的 5.1版本开始,Matlab提供了自带的C++Com- plier--mcc,该编译器能够将 Matlab的 m文件转换为 C/C++代 码[1]。因此,它为 C/C++程序调用 m文件提供了另一种便捷的 方法。下面举例说明相应步骤: (1)建 m文件 example3.m,内容为: function y = exmaple3(n) y = 0; for i = 1:n y = y+i; end 保存后在命令窗口中输入: ( 格式 pdf格式笔记格式下载页码格式下载公文格式下载简报格式下载 :mcc-t-L Cpp-h文件名) mcc-t-L Cpp-h example3 然后会在工作目录下生成 example3.cpp 和 example3.hpp 两个文件。 (2)在VC中新建一个基于对话框的MFC应用程序 Test2, 添加 Test按钮及响应函数,函数内容见 e步。将上面生成的 两个文件拷贝到 Test2工程目录下。 (3)在 VC中选择:工程->设置,选择属性表 Link选项,下 拉菜单中选择 Input,在对象/库模块中加入 libmmfile.lib libma- tlb.lib libmx.lib libmat.lib libmatpm.lib sgl.lib libmwsglm.lib lib- mwservices.lib,注意用空格将它们格开;而在忽略库中加入 msvcrt.lib;然后选择属性表 C/C++选项,下拉菜单选 General, 在预处理程序定义中保留原来有的内容,并添加 MSVC, IBMPC,MSWIND,并用逗号将它们隔开。再选择下拉菜单的 Precompiled Headers选项,在“自动使用预补偿页眉”中添加 stdafx.h,然后确定。 (4)选择:工具->选项,属性页选择“目录”,在 include files 图 1 exmaple2.exe运行结果 468 2009,30 (2) 计算机工程与设计 Computer Engineering and Design 里面加入: C:\MATLAB6p5p1\extern\include, C:\MATLAB6p5p1\extern\include\cpp; 然后在 Library files里面加入: C:\MATLAB6p5p1\bin\win32, C:\MATLAB6p5p1\extern\lib\win32\microsoft\msvc60;注意 根据用户的 Matlab安装位置,修改相应目录。 (5)在 Test按钮响应函数所在文件中添加如下的头文件: ...... #include "matlab.hpp" #include "example3.hpp" ...... Test函数响应代码为: int i; mwArray n; n = 10; n = example3(n); i = n.ExtractScalar(1); CString str; str.Format("example3的返回值是:%d",i); AfxMessageBox(str); (6)编译,连接,执行,结果如图 2所示。 注意:如果用户程序中用到其它函数,Matlab将为每个函 数生成对应的hpp和 cpp文件,必须将它们拷贝到工程目录下。 此方法虽能将 m文件转化为 C/C++代码,然后包含到 C/ C++程序中。但是每次都需要把 Matlab 生成的一大堆 cpp 和 hpp文件拷到 C/C++工程中,这是很不方便的。 3.3 利用 mcc编译器生成的的 DLL文件 Matlab自带的 C++ Complier不仅能够将Matlab的m文件 转换为 C/C++的源代码,还能产生完全脱离Matlab运行环境 的独立可执行 DLL程序。从而可以在 C/C++程序中,通过调 用 DLL实现对 Matlab代码的调用。下面,通过一个简单的例 子说明 C/C++调用 m文件生成的 DLL: (1)建立 m文件 example4.m: function result = example4(para) x = [1 para 3]; y = [1 3 1]; plot(x,y); result = para*2; 然后在命令窗口中输入: (格式:mcc-t-W libhg:<生成的 dll文件名> -T link:lib-h libmmfile.mlib libmwsglm.mlib 文件名) mcc-t-W libhg: example4-T link: lib-h libmmfile.mlib lib- mwsglm.mlib example4 然后在工作目录下会生成 example4.dll,example4.lib, example4.h共 3个文件。 (2)在 VC中新建一基于对话框的应用程序 Test3,然后添 加 Test按钮及响应函数,函数内容见 d步,再将生成的 3个文 件拷贝到 Test3工程目录下。 (3)VC编译环境的设置如同(3)、(4)步; (4)在 Test按钮响应函数所在文件中添加如下的头文件: ...... #include "example4.h" ..... Test函数响应代码为: mxArray* para = mxCreateDoubleScalar(2); mxArray* result; example4Initialize(); result = mlfExample4(para); CString str; str.Format("%f",mxGetScalar(result)); AfxMessageBox(str); (5)编译,连接,执行,结果如图 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问题,通过研究给出了常用的 3种方法及其 特点:利用Matlab计算引擎的方法,由于混合编程后的可执行 程序脱离不了Matlab的运行环境,运行速度很慢;利用mcc编 译器将m文件转化为C/C++文件的方法,虽能独立于Matlab运 行环境,但在C/C++环境中包含生成的文件非常繁琐;然而,调 用m文件生成的 DLL为用户提供了一种简洁有效的方法。除 了Matlab自带的 mcc外,Matcom也能将 m文件编译为 C/C++ 文件和 DLL文件[2,6],但混合编程原理一样,在此省略。 (下转封三) 图 2 Test2运行结果 图 3 Test3运行结果 徐红艳,冯勇:基于 Agent集成学习情境的 E_Learning系统设计与实现 2009,30 (2) 521 信息,知识资源Agent承担了知识抽取工作,服务器支出较少。 并且个人需求的处理也已在系统构建时完成,这极大地减少 了在线处理量;最终使用 CAIS学习的学生在学习效率 (人均 完成课程所需上机时间)和学习效果(考试通过率)方面都得到 了显著的提升。对比的结果反映出依据本文所给设计实现的 基于 Agent 集成学习情境的 E_Learning 系统具有良好的系统 性能,有利于提高用户的学习效率。 5 结束语 当今时代,需要 E_Learning系统适应人和知识资源分布 广泛的特征,并注重对用户个性化需求的满足。本文在分析 新需求的基础上,对 E_Learning系统进行设计,提出了基于 Agent集成学习情境的 E_Learning系统框架,给出了系统关键 组件的实现方法,最后对系统加以实现,并分析了系统的应用 效果。通过应用效果的对比可知,基于 Agent集成学习情境的 E_Learning系统具有良好的系统性能,并能有效提高用户的学 习效率。为更好满足用户个性化学习需求,下一步研究的重 点是扩充用户轮廓 记录 混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载 的学习情境信息,使用数据挖掘算法 发掘用户更多的认知特性,提高 E_Learning系统的个性化服 务水平。同时结合实际需求不断完善 E_Learning 系统结构, 拓宽 E_Learning系统的应用领域。 参考文献: [1] 彼得·德鲁克.巨变时代的管理 [M].北京:机械工业出版社, 2006. [2] 陶峻.知识密集型服务企业的演变趋势[J].生产力研究,2005(3): 15-16. [3] 林东清.知识管理理论与实务[M].北京:电子工业出版社,2005. [4] 胡维华,朱杰杰,王国荣.基于网络教学的智能虚拟电子学习环 境[J].计算机时代,2005(3):3-4. [5] 何烽,魏顺平,韩光艳.E_Learning在企业的实施与应用[J].经济 师,2004(12):103-104. [6] Duke H C,Jeoungkun K,Soung H K.ERP training with a web- based electronic learning system:The flow theory perspective[J]. International Journal of Human-Computer Studies,2007,65(3): 223-243. [7] 杨威,苑戎.一种基于Agent的电子学习体系模型的研究[J].计 算机工程与应用,2004,40(11):156-158. [8] Guidon J, Pierre S. A client-server architecture for an instruc- tional environment based on computer networks and the internet [J].Telematics and Informatics,1996,13(1):11-22. [9] 周必水,谢红标.基于Web的智能化学习系统的设计与实现[J]. 计算机工程与设计,2005,26(11):3130-3132. [10] Wooldridge M,Jennings N R.Intelligent agents theory and prac- tice[J].Knowledge Engineering Review,1995,10(2):115-152. [11] Hannoun M,Sichman J S,Boissier O,et al.Dependence relation between roles in a multi-agent system:Towards the detection of inconsistencies in organization[C].Proc of 1st Int Workshop on Multi-Agent Systems and Agent-based Simulation.Berlin,Ger- many:Springer-Verlag,1998:169-182. [12] Chen C M,Hsieh Y L,Hsu S H.Mining learner profile utilizing association rule for web-based learning diagnosis[J].Expert Sys- tems with Applications,2007,33(1):6-22. [13] 周明建,高济.知识管理系统中的用户界面[J].计算机辅助设计 与图形学学报,2005,17(5):1101-1106. [14] Danilowicz C,Nguyen H C.Using user profiles in intelligent in- formation retrieval[C].Proc of the 13th International Symposium on Methodologies for Intelligent Systems. Berlin, Germany: Springer-Verlag,2002:223-231. [15] Probst G,Raub S,Romhardt K.Managing knowledge:Building blocks for success [M]. Chichester, UK: John Wiley and Sons, 2000. [16] 周明建,陶俊才.知识管理系统中的知识推送[J].计算机辅助设 计与图形学学报,2006,18(8):1218-1223. [17] 周明建.基于本体的开放式知识管理研究[D].浙江:浙江大学, 2004. 表 4 传统 E_Learning系统与 CAIS应用效果的对比 指标 传统 E_Learning系统 CAIS 初始用户界面生成速度/秒 2.378 1.575 用户界面更新速度/秒 0.756 0.324 平均服务器资源占用率/% 78.6 35.7 平均服务器输出流量/(兆字节/次) 786 58 人均完成课程所需上机时间/学时 35.6 32.7 考试通过率/% 77.8 94.4 参考文献: [1] 张志涌.精通Matlab6.5版[M].北京:北京航空航天大学出版社, 2003. [2] 杨波,亓波.精通Matlab7.0混合编程 [M].北京:电子工业出版 社,2006. [3] 董维国.深入浅出Matlab7.X混合编程 [M].北京:机械工业出 版社,2006. [4] 钱能.C++程序设计教程[M].北京:清华大学出版社,2005. [5] 哈特.Win32系统编程[M].2版.北京:中国电力出版社,2003. [6] 董长虹. Matlab接口技术与应用 [M].北京:国防工业出版社, 2004. [7] 张威.Matlab外部接口编程[M].西安:西安电子科技大学出版 社,2004. [8] 苏金明,黄国明,刘波.Matlab与外部程序接口[M].北京:电子工 业出版社,2004. (上接第 468页)
本文档为【Matlab与C_C++混合编程技术研究】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_491967
暂无简介~
格式:pdf
大小:292KB
软件:PDF阅读器
页数:5
分类:互联网
上传时间:2011-07-03
浏览量:23