欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    Matlab混合编程.docx

    • 资源ID:70344496       资源大小:522.91KB        全文页数:16页
    • 资源格式: DOCX        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    Matlab混合编程.docx

    专业实习 论 文题目: Matlab与C/C+混合编程技术 姓 名 魏安军 学 院 理学院 专 业 数学与应用数学 班 级 06201 学 号 060680 班内序号 07 2009年 8月摘要本文先通过介绍Matlab的接口技术引入Matlab与C/C+混合编程的先决条件,通过阐述不同编程环境下的缺点证实混合编程的需要,扬长避短发挥出Matlab与C/C+结合的最大优点。然后,本文对混合编程技术进行深入探究,具体到两种易可行的方法:MEX技术和调用Matlab计算引擎技术。在MEX技术中,主要是通过Matlab调用C/C+来实现,本文讲解了使用MEX文件的优点,这里主要包括代码重用,速度提升,功能扩展。经过工作环境的设置后,通过两个简单的例子说明了C/C+语言MEX文件的基本写法和一些库函数的使用。在调用Matlab计算引擎技术中,主要是通过Visual C+编程环境来实现。本文先探讨了使用该引擎的优点集中在两个方面:强大的矩阵计算能力和图形显示能力。然后简单介绍了引擎库函数的原型和功能和调用Matlab引擎时的环境配置。最后通过Visual C+调用Matlab引擎的实例来说明混合编程的高效。1. 背景知识1.1. 关于MATLAB的接口技术Matlab是美国Mathworks公司开发和发行的一个软件产品。它是一个交互式的开发系统,具有强大的数值计算和图形显示能力,以及易用的编程开发语言。现在的Matlab接口技术包括如下几个方面的内容:l 数据的导入导出。这些技术主要包括在Matlab环境里利用MAT文件技术来进行数据的导入导出。l 和普通的动态链接库(DLL)文件的接口l 在Matlab环境里调用C/C+,FORTRAN语言代码的接口。这个接口是通过MEX技术实现的。利用MEX技术,C/C+或者FORTRAN代码通过实现一个特殊的入口函数,就能够被编译成MEX文件。l 在Matlab调用Java。从v6.0版本之后的Matlab都包含一个Java虚拟机器,所以用户可以通过Matlab命令来使用Java语言解释器,从而实现对Java对象的调用。l 对COM和DDE的支持。l 在Matlab实用网络服务。l 和串行口的通信接口Matlab给用户提供了如上非常丰富的接口技术,包括和其它语言程序的接口,真正实现在不同程序之间共享数据的接口,使得编程和计算的效率大幅度的提高。1.2. 关于MATLAB与C/C+混合编程虽然Mtalab是以矩阵为基本运算单位的高效数值计算软件,带有功能强大的数学函数库,并开发有多种学科领域的工具箱函数库,广泛地应用与科学研究与工程计算,然而其自身存在的一些缺点限制了它在更多方面的应用:l Matlab程序不能脱离其运行环境,可移植性差。l Matlab是一种解释性语言,语言执行效率低,实时性较差。l Matlab的界面开发能力较差,难以开发出友好的应用界面。l Matlab编写的M文件是文本文件,容易被直接读取,难以保护劳动者的成果。Visual C+用于面向对象的可视化编程,可以完成从底层软件直到面向用户软件等各种应用程序的开发。利用它提供的各种实用工具,开发者可以轻松开出高效强大的Windows应用程序。但在实际工程开发中,与Matlab相比:l Visual C+在数值处理分析和算法工具等方面不如Matlab。l Visual C+在准确方面地绘制数据图形(数据可视化)方面不如Matlab。因此,把Matlab在数值计算、算法设计以及数据可视化等领域的优势与VC+应用系统集成,不仅可以完全满足系统在数据运算与表现方面的需求,而且还可提高系统处理的效率和稳定性,同时也减少了开发人员实现算法的困难,缩短了软件开发的周期,提高了软件质量,在实践中具有很高的使用价值。2. MATLAB调用C/C+2.1. MEX技术概述MEX代表Matlab Executable。MEX文件是一种特殊的动态连接库函数,它能够在Matlab里像一般的M函数那样来执行。MEX文件必须导出一个特殊的函数以作为在Matlab中使用的接口,另外也可以包含一个或多个用户自己定义的函数。MEX文件可以通过编译C/C+,或者FORTRON源文件来产生。因此,使用文件给用户提供了一种在Matlab使用其它编程语言的途径。一般来说,使用MEX文件的优点包括:l 代码重用。通过MEX方式,用户可以实现在Matlab中使用已有的代码l 速度提升。一些复杂的算法使用C/C+或者FORTRON开发,有可能加速程序的运行速度。l 功能扩展。通过MEX方式,用户可以调用系统函数或者实现和硬件的交互,从而扩展程序功能。MEX文件在不同计算机操作系统上的后缀名不同,我们这里只讨论在Windows上的,MEX文件的后缀名和普通动态链接库一样,也是dll。在相应的平台上,Matlab能自动检测到MEX文件的存在。和普通的M文件一样,只要MEX文件在Matlab的搜索路径上,那么在Matlab命令行输入某个MEX文件名(不带后缀名)就能够执行该MEX文件。2.2. 工作环境的设置MEX文件是通过编译相应的C/C+或FORTRON源程序产生的。Matlab对MEX文件的支持是内置的,并不需要特殊的工具箱或者Matlab编译器。不过Matlab需要使用外部编译器来完成对源程序的编译。在安装完Matlab和所需的编译器后,需要配置MEX编译环境。Matlab编译MEX文件的命令是mex。在使用mex命令编译之前,需要先在Matlab命令行用下面的命令配置编译环境:>> mex setup这个命令将会自动检测当前计算机上已经安装的它所支持的编译器,并将其在命令行中罗列出来,用户可以选择使用哪个编译器来编译MEX文件。本论文针对Visual C+,一种在Windows平台使用极其广泛的C/C+编译器,来介绍如何配置mex命令。下图是从Matlab 7.7.0命令行环境复制得到,它演示了配置的大致流程。图 1 配置mex命令流程可以看出,Matlab能够自动检测到本地计算机上已经安装了Visual C+ 6.0,在加上Matlab自己提供的Lcc编译器。然后选择了第二个也就是VC+ 6.0,Matlab会自动搜索到所选编译器的路径,根据配置文件的模版,最终产生名为mexopts.bat的配置文件。上面例子中,mexopts.bat的路径为:C:Documents and SettingswuhaoApplication DataMathWorksMATLABR2008bmexopts.bat。下图主要显示了mex命令的简单格式,和帮助命令的格式。关于更多mex命令的语法可以通过帮助文件获得,这里就不在赘述。图 2 mex命令使用格式2.3. C/C+语言MEX文件一个C/C+ MEX源程序通常包括如下4个部分,其中前面3个是必须包含的内容,至于第4个,则根据所实现的功能可以灵活选用。(1) #include "mex.h"(2) MEX文件的入口函数mexFunction(3) mexArray(4) API函数其中,mex.h是一个头文件,它给出了以mx,mex打头的API函数的定义。每个C+语言MEX源程序都必须包含它,否则编译过程无法顺利完成。MEX文件其实是个动态连接库文件。它只导出一个函数mexFunction。当在Matlab命令行调用编译好的MEX文件时,只需要直接输入MEX文件的名字(不包括后缀名)即可。假设MEX文件名为myfun.dll,那么可以在Matlab环境用类似“输出变量=myfun(输入参数)”的形式来调用myfun.dll。在C+语言中,mexFunction的定义如下:void mexFunction(int nlhs, mxArray *plhs, int nrhs, const mxArray *prhs );nrhs是个整数,表示调用形式中等号左边的变量的数目,也就是调用形式中输出变量的个数。plhs 是一个关于指向mxArray变量指针的数组,数组长度和nrhs相同,数组中元素排列顺序按照调用时输出参数从左到右排列。nrhs也是整数,表示在调用形式中等号右边的参数个数,也就是输入参数的数目。prhs也是一个关于指向mxArray变量指针的数组,其长度和nrhs相同。prhs中的各元素的排列顺序按照调用时输入参数从左到右排列。nlhs和nrhs都可以为0,Matlab限制了它们的最大值为50。数据类型mxArray是在matrix.h中定义的,是一个结构体(struct)。Matlab的所有变量类型,无论是标量还是向量或者矩阵都可以在C+用mxArray来描述。它是在Matlab和C+程序交换数据的桥梁。C+程序必须使用mxArray来访问Matlab各种数据类型。同时,Matlab也只能通过mxArray和C+程序交换数据。l 下面对mex.h中定义的部分C-MEX函数的原型和功能进行说明。若读者想了解更多,可以去查阅相关头文件。1 mexErrMsgTxt()原型:void mexErrMsgTxt(const char *error_msg);功能描述:发出报错信息,然后返回Matlab提示符。2 mexErrMsgAndTxt()原型:void mexErrMsgAndTxt(const char *identifier, const char *err_msg, )功能描述:按指定的格式发出报错信息,并返回Matlab提示符。3 mexWarnMsgTxt()原型:void mexWarnMsgTxt(const char *warn_msg)功能描述:触发一个没有定义标示的告警信息。4 mexWarnMsgIdAndTxt()原型:void mexWarnMsgIdAndTxt(const char *identifier, const char *warn_msg)功能描述:按指定得格式发出告警信息,并返回Matlab提示符。5 mexPrintf()原型:int mexPrintf(const char *fmt, );功能描述:相当于Matlab中的disp命令。在mex.h中有以下语句,将printf语句按mexPrintf执行。6 mexMakeArrayPersistent()原型:void mexMakeArrayPersistent(mx Array *pa);功能描述:从Matlab的内存分配表中删除矩阵的所有组件,包含矩阵头本身。当删除一个矩阵时必须调用mxDestroyArray()函数。7 mexMakeMemory Persistent()原型:void mexMakeMemory Persistent(void *ptr)功能描述:从Matlab的内存分配表中去除前面通过mxAlloc()分配的内存。为了释放内存,需要调用mxFree()函数。8 mexGetFunctionHandle()原型:void mexGetFunctionHandle(void)功能描述:查找一个函数,并返回可与mexCallMATLABFuntion一起使用的函数句柄。9 mexCallMATLABFunction()原型:void mexCallMATLABFunction(void)功能描述:执行一个函数,函数句柄是通过mexGetFunctionHandle得到的。10. mexRegisterFunction()原型:void mexRegisterFunction(void)功能描述:记录一个函数指针,作为MATLAB可调用函数。l 下面的例子非常简单,类似在学习其它编程语言时常用的“Hello World!”程序,功能是在命令行输出一串字符。首先创建一个C+语言源程序myhello.cpp,然后加入如下内容:【例1】myhello#include "mex.h"void mxFunction(int nlhs, mxArray *plhs , int nrhs, const mxArray *prhs )mexPrintf("Hello World!n");写好程序保存后,在Matlab命令行切换到myhello.cpp所在的目录,然后用如下的命令进行编译:>> mex myhello.cpp如果在Windows上,将得到一个DLL文件:myhello.dll,这就是编译好的MEX文件。运行结果如下:>> myhelloHello World!Matlab API提供了一系列程序来处理Mtalab所支持的各种数据类型,每一种数据类型都有对应函数来处理对应的数据。下面给出一个简单的C语言程序和与之对应的MEX文件代码,改程序的功能是将标量x加倍。【例2】timestwoC语言程序如下:#include "math.h"void timestwo(doule y, doule x)y0=2.0*x0;return;下面是与C语言程序功能相同的MEX文件:#include "mex.h"void timestwo(double y, double x)y0=2.0*x0;void mexFunction(int nlhs, mxArray *plhs, int nrhs, const mxArray *prhs)double *x, *y;int mrows, ncols;/检查正确的参数数目if (nrhs!=1)mexErrMsgTxt("需要一个输入参数");elseif (nlhs>1)mexErrMsgTxt("输出参数太多");/输入变量必须是非复数类型的标量mrows=mxGetM(prhs0);ncols=mxGetN(prhs0);if (!mxIsDoule(prhs0)|mxIsComplex(prhs0)|!(mrows=1&&ncols=1)mexErrMsgTxt("输入变量必须是非复数类型的标量");/为返回参数创建矩阵plhs0=mxCreatDouleMatrix(mrows, ncols, mxREAL);/分配输入,输出参数的指针x=mxGetPr(prhs0);y=mxGetPr(plhs0);/调用timestwo子函数timestwo(y, x);程序中在mex.h中定义的C-MEX函数的原型和功能可以通过相应的帮助文件查阅得知。如果将上面的MEX文件命令为timestwo.c,就可以对它进行编译和链接,在Matlab命令窗口中输入:mex timestwo.c这是产生MEX文件timestwo.dll所必须的步骤。此时就可以像调用M函数一样调用timestwo了。在Matlab命令窗口中输入:>> x=2;>> y=timestwo(x);就可以得到:y=4;3. C/C+调用Matlab计算引擎3.1. Matlab引擎简介在上文中我们了解到Matlab可以被C/C+,FORTRAN等程序调用,也可以调用C/C+,FORTRAN程序。从编程复杂的角度来看,通过引擎实现混合编程是最简单的途径,即在其它应用程序中向Matlab发送命令,控制它的运行。在这种情况下,用户的C/C+,FORTRAN应用程序将Matlab作为一个计算或图形显示的引擎来调用。所谓Matlab引擎,是指一组Matlab提供的接口函数,它支持C/C+和FORTRAN几种语言。通过这些接口函数,用户可以在C/C+,FORTRAN的应用程序中实现对Matlab的控制,Matlab引擎函数库在后台工作。具体的,Visual C+之类的通用编程平台一般利用Matlab引擎完成以下功能:Ø 调用Matlab的图形函数库,将一些Visual C+编程复杂高、难以实现的图形显示任务由Matlab处理。这时,Matlab就是一个功能强大的图形函数库Ø 调用一个数学函数或着子程序来处理数据。这时,Matlab就是一个强有力、编程灵活且高效的数学函数库。Ø 利用Matlab编程高校和强大的计算能力,结合Visual C+之类的通用编程平台输入、输出功能强大,编写图形界面简单的特点,可以为特定的任务建立一个高效的,界面友好的系统,达到缩短开发周期、降低开发难度的目的。通过Matlab引擎,应用程序会打开一个新的Matlab进程。可以控制它完成任何计算和绘图工作,对所有的数据结构都提供支持。因此,实际上应用程序是预先存储了Matlab的命令,然后自动地送给Matlab执行。与其他各种编程接口相比,Matlab引擎方式最简单也最全面,而且工作时不需要Matlab整个与应用程序相连,只需要一小部分引擎通信函数库与程序相连。因此,它大大节约了系统资源,还可以充分利用网络资源,将计算任务繁重的工作放到性能最好、运算能力最强的计算机上,通过网络运行Matlab引擎。1.2.3.3.1.3.2. Matlab引擎库函数Matlab引擎库包含了一系列从外部应用程序调用和控制Matlab引擎的函数。下表列举了C语言的引擎库函数,这些函数后使用了eng前缀名表 1 C语言引擎函数库引擎函数功能描述engOpen启动Matlab计算引擎engGetArray从Matlab引擎获得一个Matlab矩阵,用于数据交换engPutArray从应用程序向Matlab引擎发送一个Matlab矩阵,用于数据交换engEvalString执行一个Matlab命令engOutputBuffer创建字符缓冲区,以获得Matlab文本输出engOpenSingleUse打开一个单独的非共享的Matlab计算引擎engClose关闭Matlab引擎engSetVisible设置Matlab引擎engGetVisible返回Matlab显示状体engGetVariable从Matlab工作区(Workspace)获得一个变量engPutVariable将指定名称的Matlab变量存入Matlab工作区关于这些函数的调用方式,可参阅Matlab的帮助文件。一般来说,在程序中调用Matlab计算引擎包含如下3个步骤:(1) 打开Matlab计算引擎。(2) 在引擎中执行Matlab命令,或者传递数据等。(3) 关闭Matlab计算引擎。打开Matlab计算引擎需要调用engOpen函数,成功打开Matlab引擎后,将在程序中获得指向该引擎的指针。通过这个指针,就可以调用引擎来执行Matlab命令了,这需要调用engEvalString函数。完成对Matlab计算引擎的调用之后,应该关闭该引擎,这需要调用engClose。1. engOpen函数原型:extern Engine *engOpen(const char *startcmd)参数说明:输入参数为一个字符指针,函数通过该指针指向的字符串所包含的命令与Matlab简历一个连接,打开一个Matlab进程,返回一个Matlab引擎类型的指针。2. engEvalString函数原型:extern int engEvalString(Engine *ep, const char *string)参数说明:ep为engOpen打开的engine指针。String为字符串,指向一个需要在Matlab计算引擎的工作区中执行的字符串。函数返回0表示成功执行,返回1则表示ep对应的Matlab Engine 已经关闭。3. engClose函数原型:extern int engClose(Engine *ep)参数说明:输入参数ep为已经打开的Matlab计算引擎。返回0表示成功关闭,返回1表示返回出错。关于更多的引擎函数的具体定义可以参见帮助文件。3.3. Visual C+调用Matlab引擎时的环境设置当在Visual C+环境下调用Matlab引擎时,编译接口环境的配置较为简单,主要有一下两步(本地计算机Matlab安装在目录C:MATLAB下)1. 添加Matlab引擎库的头文件和库函数的路径打开菜单“Tools”,选取“Options>Direction”。在“Show directories for”选项卡选取“Include files”,添加“C:MATLABEXTERNLIBWIN32MICROSOFTMSVisual C+60”(如图3所示),因为这些引擎库用到的动态链接库都在此目录下。2. 完成Matlab引擎对应的静态链接库的导入工作在菜单“Project>Setting”下,选取“Link”选项卡,在“Objecct/Library Modules”里添加libmx.lib、libmex.lib和libeng.lib。注意三个文件名中间以空格分开(如图4所示)经实验发现,还可以将此步设置改为:在Visual C+ 6.0环境中,选择“Project”菜单中的“Add to Project”命令,然后选择Files选项,将“C:MATLABEXTERNINCLUDELIBWIN32MICROSOFTMSVC60”目录下的liteng.lib,limex.lib,libmx.lib文件加到工程中。它同样可以将三个静态链接库添加到当前工程中来。图 4 Include files 路径配置对话框图 5 Engine方式静态链接库设置3.4. Visual C+调用Matlab引擎实例下面通过一个简单的实例来说明Matlab引擎的使用,它是一个基于对话框的MFC应用程序,Visual C+下利用Matlab工具箱进行信号处理和图形显示的操作。启动Visual C+,建立一个新工程,选择MFC AppWizard,工程名为MATLABEngine。而后选择“Dialog based”,即生成一个基于对话框的MFC应用程序。其余各项采用默认设置。使用库的头文件matlib.h。首先添加Matlab引擎库的头文件和库函数的路径,然后在MATLABEngineDlg.cpp中添加engine.h。添加Matlab引擎库对应的静态链接库文件在对话框窗体中添加一个按钮,如下图所示设置按钮的标题和控件ID:图 6 按钮控件的标题和控件ID设置对话框通过Visual C+的ClassWizard,添加按钮的单击响应事件,并添加如下代码。void CMATLABEngineDlg:OnMATLABEngineEngine *ep; /定义Matlab引擎变量MessageBox("单击确定按钮,Windows正在准备启动Matlab引擎!","Matlab引擎", MB_OK|MB_ICONINFORMATION);if (!(ep=engOpen("0") /打开Matlab引擎fprintf(stderr, "n Matlab引擎启动失败!n");MessageBox("Matlaby引擎启动失败!", "Matlab引擎", MB_OK|MB_ICONERROR);exit(-1);MessageBox("单击确定按钮,隐藏Matlab!", "Matlab引擎", MB_OK|MB_ICONINFORMATION);engSetVisible(ep, 0); /隐藏Matlab窗口MessageBox("单击确定按钮,系统重新显示Matlab!", "Matlab引擎", MB_OK|MB_ICONINFORMATION);engSetVisible(ep, 0); /重新显示Matlab窗口mxArray *T=NULL;double time10=0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0;/生成矩阵T=mxCreateDoubleMatrix(1, 10, mxREAL);memcpy(void *)mxGetPr(T), (void *)time, sizeof(time);/将矩阵变量写入Matlab引擎的工作区engPutVariable(ep, "T", T);/通过Matlab引擎执行Matlab命令engEvalString(ep, "D=0.5*(-9.8).*T.2");engEvalString(ep, "plot(T,D);");engEvalString(ep, "title('Position vs.Time for falling object');");engEvalString(ep, "xlabel('Time(seconds)');");engEvalString(ep, "ylabel('Position(meters)');");engEvalString(ep, "grid on;");/释放矩阵变量T占用的内存空间 mxDestroyArray(T);MessageBox("通过例程,说明Matlab的图形显示能力!", "Matlab引擎", MB_OK|MB_ICONINFORMATION);/画一朵花 engEvalString(ep, "x=-8:0.5:8;");engEvalString(ep, "y=x;");engEvalString(ep, "Y,X=meshgrid(y,x);");engEvalString(ep, "R=sqrt(X.2+Y.2)+eps;");engEvalString(ep, "Z=2*sin(R)./R;");engEvalString(ep, "surf(X,Y,Z);");MessageBox("关闭Matlab引擎,系统将退出Matlab应用程序!","Matlab引擎", MB_OK|MB_ICONINFORMATION);engClose(ep); /关闭Matlab引擎,退出Matlab按F7键编译后再执行,将会出现对话框。单击“MATLABEngine”按钮,将会出现Windows的标准信息框,出现“单击确定按钮,Windows正在准备启动Matlab引擎!”提示信息。单击“确定”按钮,可以看到任务栏出现Matlab的图标,它表示Matlab已经启动。然后会出现“隐藏Matlab”的信息提示框,同样单击“确定”按钮,可以看到任务栏上的Matlab图标立即隐藏。此时Matlab仍在后台运行。然后,按照提示进行操作,系统会在任务栏出现“重新显示Matlab的图标”信息,并先后出现下面各图的实验结果。图 7 实验结果一可以看出,Matlab引擎工作方式实质上是Visual C+等通过编程平台实现了和Matlab的交互,它将需要在Matlab环境中执行的命令预先“存储”在Visual C+的应用程序中,然后自动的送给Matlab执行。当然,可以通过向Matlab引擎工作空间读取或写入变量实现Matlab和Visual C+的数据交互。图 8 实验结果二4. 参考文献【1】 杨高波,元波. 精通MATLAB 7.0混合编程. 北京:电子工业出版社. 2005【2】 董维国. 深入浅出MATLAB 7.x混合编程. 北京:机械工业出版社. 2006

    注意事项

    本文(Matlab混合编程.docx)为本站会员(asd****56)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开