⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 matlab 大观园 --- 程序下载.htm

📁 一个相当全面的关于matlab与各类语言接口技术。含有C
💻 HTM
📖 第 1 页 / 共 5 页
字号:
      Matlab的编译器可将Matlab的M文件转换为为C或C++的源代码以产生完全脱离Matlab运行环境的独立的运用程序,但Matlab本身的资料说明编译器如用来建立独立的运用程序,不能调用Matlab工具箱中的函数,这非常不利于搞一些特殊的算法。本人研究了一段时间发现,工具箱中的函数既然是M文件就一定可以用编译器来编译,以提供如Vc的调用函数,但是编译器只能编译一个独立的M文件,即这个 
      M文件不依赖于其他的M文件。如果M文件中又调用了其他的M文件,可将被调用的M文件拷贝到调用M文件的相应位置,作适当的改动就可以用于编译器编译。编译器不支持图形函数,所以M文件中如有图形函数需注释掉。</P>
      <P align=justify>&nbsp; 当Matlab的编译器mcc加入适当的参数-e(mcc –e *.*)或-p(mcc –p 
      *.*)就可生成将输入的M文件转换为适用于特定运用的C或C++源代码。这样如果要在Vc下编译通过,还需连入以下几个库libmmfile.dll, 
      libmatlb.dll, libmcc.dll, libmat.dll. libmx.dll. mibut.dll 以及Matlab C 
      MATH库,建议采用前述的方法将动态连接改为静态连接。对于C/C++编译环境的设置,在Matlab command窗口下运行mex –setup 
      然后依提示操作,而对于C/C++连接环境的设置,运行mbuild –setup依提示操作即可。</P>
      <P align=justify>&nbsp; 下面给出利用编译器将Matlab工具箱中psd.m文件生成可供Vc调用的函数。</P>
      <OL>
        <LI>将psd.m文件拷贝一份至Matlab\bin目录下,改写相应调用的M文件如nargchk.m, 
        hanning.m等。为生成的代码简洁,对于采集数据处理输入参数很明了的情况下可作大量的删减,最终使psd.m成为一个不依赖于其他M文件的独立的M文件,注意千万注释掉作图代码,最终改成如下形式,限于篇幅给出关键的几步: 

        <P>function [Pxx,f]=psd(Fs,nfft,noverlap,x)<BR><FONT face=宋体 
        size=1></FONT>window=o,5*(1-cos(2*pi*(1:nfft)’/(nffft+1)));//hanning 
        窗<BR>dflag=’none’;<BR>window=window(;)<BR>………………………………….</P>
        <P align=justify>以上只要稍懂Matlab语言和信号处理知识就可完成这项工作。</P></LI></OL>
      <OL>
        <LI>假设上述代码重新存为testwin.m,在Matlab command 窗口下设置好环境参数运行mcc –e 
        testwin,则可在Matlab\bin下生成testwin.c ,如运行mcc –p testwin 则生成testwin.cpp. 
        <LI>Vc下建立一个基于对话框的文件,然后在对话框里加一个Button控件OnButtonPsd 
        <P align=justify>将上述生成的.c文件的头文件加入到工程的.cpp中,且将#ifdef_cplusplus</P>extern 
        “c”{<BR>#end 
        if<BR>c代码声明加入Vc的包含文件和生成的.C的包含文件之间<BR>将#ifdef_cplusplus<BR>}<BR>#end 
        if加入.cpp文件未尾<BR>
        <LI>
        <P align=left>为了简洁且便于处理将生成的c函数稍改动,给出部分代码如下: </P></LI></OL>
      <BLOCKQUOTE>void CTestpsdwinDlg::OnButtonPsd(){<BR>mxArray* 
        x_rhs_;//指向采集数据存放区<BR>Fs=23510;//数据采集的频率 nfft=1024;//1024点的fft<BR>double 
        datax[1024]//采集的数据<BR>x_rhs_mxCreateDoubleMatrix(1,1024,mxReal);<BR>memcpy(mxGetPr(x_rhs_),datax,1024*sizeof(double));<BR>noverlap=512;<BR>……………….<BR>……………….<BR>mccCopy(&amp;Pxx,&amp;Spec);<BR>mccCopy(&amp;f,&amp;frevgg_vector);<BR>for(int 
        j=0;j&lt;(int)(nfft/2+1);j++)<BR>{<BR>datap[j]=mccGetRealVectorElement(&amp;Pxx, 
        (j+1));//功率谱密度存于datap[]数组<BR>dataf[j]=mccGetRealVectorElement(&amp;f, 
        (j+1));//相应频率存于数组dataf[]中<BR>}<BR>mccFreeMatrix(&amp;Pxx);<BR>……………….<BR>SendMessageBox(WM_PAINT,0,0);//利用Vc下的图形函数画图<BR>Return;<BR>}<BR></BLOCKQUOTE>
      <P align=left>&nbsp; 如上生成的程序可读性不太好,而生成的c++代码则可读性较好,但千万注意只能用 
      Matlab的MATH库,不可用c++的MATH库,否则编译会出错,限于篇幅在此不述。</P>
      <P align=justify>3)利用Matcom调用工具箱中的函数</P>
      <P align=left>&nbsp; 
      Matcom编译M文件,先将M文件按照与Matcom的cpp库的对应关系翻译为cpp源代码,然后用对应版本的c编译器将cpp文件编译成相应的exe或dll文件,所以第一次运行要指定c编译器的路径,否则无法编译,指定好的编译信息就写在Matcom\bin\matcom.ini文件中,不过这一步按装matcom时,它自动寻找编译器并将其写入matcom.ini文件中,matcom4.5版中使用TeeChart3.0 
      OCX控件,因而它支持图形操作。 &nbsp; 
      我们依然用上述的testwin.m文件,不要将图形函数注释掉,利用Mideva来生成可被Vc调用的信号处理程序。</P>
      <OL>
        <LI>运行Mideva在主界面上直打开M文件,在菜单中选择compile to dll,输入testwin..在Matcom 
        debug目录下可以找到这样的几个文件,testwin.c 
        ,testwin.h,testwin.cpp,testwin.lib,testwin.dll,testwin.exp等。 
        <LI>将上述testwin.cpp和testwin.h加入工程中,project/add to 
        project/files并且在相应的文件中加入”stdafx.h” 
        <LI>加连接库:Tools\option\directory\ , 选include选项,加入e:\matcom45\lib 
        (包含matcom.h) </LI></OL>
      <P align=justify>library选项,加入e:\matcom45\lib</P>
      <P align=justify>4) project\add to project\files 
      文件类型选项选(.lib)将e:\matcom45\lib\v4501.lib加入工程中编译运行。相应代码如下:</P>void 
      CtestmatcomDlg::OnpsdButton(){ <BR>double datap[512],dataf[512]; 
      <BR>initM(MATCOM_VERSION);//初始化matcom库 <BR>Mm Fs,nfft,noverlap;//创建矩阵 
      <BR>Mm x=zeros(1,1024); <BR>Fs=1024;nfft=1024;noverlap=128; 
      <BR>dMm(Pxx_o);dMm(f_o);//创建并命名矩阵<BR>datax[];//数据采集的数据存于此数组中 <BR>for(int 
      i=1;i&lt;=1024;i++) <BR>{ <BR>x.r(1,i)=datax[i+1];//给x阵赋值 <BR>} 
      <BR>testwin(Fs,nfft,noverlap,x,i_o,Pxx,f_o);//matcom生成的函数 
      <BR>for(i=0;i&lt;513;i++){//取出功率谱密度分析结果 <BR>dataf[i]=f_o.r(i+1,1); 
      <BR>datap[i]=Pxx_o.r(i+1,1);} <BR>exitM(); <BR>return; <BR>} 
      <P>&nbsp; 
      可见利用Matcom进行M文件转换非常的容易,生成的代码可读性很好,以上的转换同时生成了可供Vc调用的动态连接库,其使用和一般的动态库一样使用。同时需指明Matcom不仅可转换独立的不依赖于其它M文件的M文件,同时可转换调用其它M文件的M文件嵌套。条件是这此M文件在同一个目录下面,如前所述的psd.m可直接用上述方法转换,生成了多个重载形式的psd函数
      <P align=justify>&nbsp; 结论: 
      利用Mtlab引擎调用工具箱中的函数可节省大量的系统资源,应用程序整体性能较好,但不可脱离Matlab 
      的环境运行。用Matlab编译器进行工具箱函数的调用,须转换相应的M文件使其成为独立的M文件,且不支持图形函数,转换的代码可读性不太好。用Matcom 
      进行转换非常方便,生成的代码可读性很好,支持图形函数,且代码执行的速度比不转换平均要快 1.5 倍以上。以上程序在Vc++ 6.0, Matlab 
      5.2, Matcom 4.5 中调试通过,以上方法在工程实践中已得到很好的运用。</P>
      <TABLE width="100%" bgColor=#00ffff border=0>
        <TBODY>
        <TR>
          <TD width="100%">
            <P align=center><FONT face=隶书 color=#000000 size=4><A 
            name=VC_ml></A>通过 VC++ 实现对 MATLAB 的调用</FONT></P></TD></TR></TBODY></TABLE>
      <P align=center>成都 .中国科学院光电技术研究所&nbsp; 邮编:610209&nbsp; 齐 波 董能力 
      <P><B>一 引言</B> 
      <P>&nbsp; 
      众所周知,MATLAB是功能非常强大的数学软件,它广泛应用于线性代数、自动控制理论、数理统计、数字信号处理、时间序列分析、动态系统仿真等领域。因此如果把MATLAB的程序加入到自己的VC++、VB、POWER 
      STATION及其它语言编制的程序中,将大大减少编程的工作量、保证程序的准确性,并且继承VC++良好的用户界面。下面就以VC++ 
      为例介绍一下它的外部调用。 
      <P><B>二 程序实现</B> 
      <P><FONT 
      color=#ffffff>--</FONT>作者实现外部调用的思路是:首先将m文件加入到一段C程序中,然后通过MATLAB中的mex批处理文件将该C文件生成exe文件,然后通过VC++的外部调用的函数:shellexec()或winexec()实现调用。 
      mex批处理文件的调用格式如下: 
      <P>mex&nbsp; -f&nbsp; msvc60engmatopts.bat&nbsp; 
      *.c<BR>c文件的格式如下:<BR>&nbsp;/* engwindemo.c<BR>&nbsp;* This is a simple 
      program that illustrates how to call the MATLAB<BR>&nbsp;* Engine 
      functions from a C program for windows<BR>&nbsp;* Copyright (c) 1996-1998 
      by The MathWorks, Inc.<BR>&nbsp;* All Rights Reserved.*/<BR>#include &lt; 
      windows.h &gt;<BR>#include &lt; stdlib.h &gt;<BR>#include &lt; stdio.h 
      &gt;<BR>#include &lt; string.h &gt;<BR>#include &lt; 
      d:\matlab\extern\include\engine.h &gt;<BR>void main()<BR>{<BR>Engine 
      *ep;<BR>/*<BR>&nbsp;* Start the MATLAB engine&nbsp;<BR>*/<BR>if (!(ep = 
      engOpen(NULL))) {<BR>MessageBox ((HWND)NULL, (LPSTR)<BR>"Can't start 
      MATLAB 
      engine",&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; , 
      MB_OK);<BR>exit(-1);<BR>}<BR>&nbsp;&nbsp;&nbsp; engEvalString(ep, 
      "contour(peaks)");<BR>&nbsp;&nbsp; &nbsp;&nbsp; 
      engClose(ep);<BR>}<BR></P><FONT color=#ffffff>-</FONT> 
      程序中的黑体部分即为要加入的m文件的位置。这样就生成了与m文件同名的exe文件,通过VC++中的外部调用函数便很容易的实现了对MATLAB的调用。 
      <P><B>三 结 论</B> 
      <P>&nbsp;本文给出了VC++等高级程序语言调用MATLAB中程序(函数)的方法,融合了VC++与MATLAB两种不同的语言,大大提高了编程效率。不失为一种较好的程序设计方法。</P>
      <TABLE width="100%" bgColor=#00ffff border=0>
        <TBODY>
        <TR>
          <TD width="100%">
            <P align=center><FONT face=隶书 size=4><A name=mcom></A>Matcom: Matlab 
            与 C++ 结合的有效途径</FONT></P></TD></TR></TBODY></TABLE>
      <P align=center>林 岚* 周云波 杨玉星 林家瑞<BR>作者单位:华中理工大学生物工程系(武汉 
      430074)<BR>*男,24岁,硕士研究生 </P>
      <P align=left><FONT 
      color=#000000>摘 要 本文首先介绍了当前在国内外十分流行的工程设计和系统仿真软件包Matlab的优缺点,然后展开介绍了Matcom(一种将Matlab与C++结合的工具)的功能及如何使用,最后对其效果进行了总结。 
        <BR>关键词 Matlab Visual C++ Matcom ECG</FONT> </P>
      <P>1 工程设计软件Matlab特点分析  </P>
      <P>&nbsp; 
      Matlab是MathWorks公司于1982年推出的一套高性能的数值计算和可视化软件。它集数值分析、矩阵运算、信号处理和图形显示于一体,构成了一个方便、界面友好的用户环境。它还包括了ToolBox(工具箱)的各类问题的求解工具,可用来求解特定学科的问题。其特点是: 
        </P>
      <P>(1)可扩展性:Matlab最重要的特点是易于扩展,它允许用户自行建立指定功能的M文件。对于一个从事特定领域的工程师来说,不仅可利用Matlab所提供的函数及基本工具箱函数,还可方便地构造出专用的函数,从而大大扩展了其应用范围。当前支持Matlab的商用Toolbox(工具箱)有数百种之多。而由个人开发的Toolbox则不可计数。<BR>(2)易学易用性:Matlab不需要用户有高深的数学知识和程序设计能力,不需要用户深刻了解算法及编程技巧。 
      <BR>(3)高效性:Matlab语句功能十分强大,一条语句可完成十分复杂的任务。如fft语句可完成对指定数据的快速傅立叶变换,这相当于上百条C语言语句的功能。它大大加快了工程技术人员从事软件开发的效率。据MathWorks公司声称,Matlab软件中所包含的Matlab源代码相当于70万行C代码。 
        <BR></P>
      <P>&nbsp; 
      由于Matlab具有如此之多的特点,在欧美高等院校,Matlab已成为应用于线性代数、自动控制理论、数理统计、数字信号处理、时间序列分析、动态系统仿真等高级课程的基本教学工具;在研究单位、工业部门,Matlab也被广泛用于研究和解决各种工程问题。当前在全世界有超过40万工程师和科学家使用它来分析和解决问题。 
         </P>
      <P>&nbsp;&nbsp; 
      然而Matlab自身所存在的某些缺点限制了它的应用范围。<BR> (1)Matlab是一种解释性语言,因此它的实时效率是相当差的。例如在笔者所从事的一个心电信号处理项目中,采用Matlab语言来处理5分钟的心电数据,在486/66系统机上需要25分钟,而同样的算法,用C语言实现,仅需30多秒。由此可见,Matlab的语言执行效率是比较低的。<BR> (2)Matlab程序不能脱离其环境运行,因此它不能被用于开发商用软件。<BR>&nbsp;&nbsp; 
      (3)Matlab程序可以被直接看到 </P>
      <P>2 Matcom:Matlab与C++的完美结合<BR>  MathTools公司推出的Matcom(可于http://www.mathtools.com处获取)可以说是以上问题的完美解决。它可将Matlab的源代码译成同等功能的C++源码。既保持了Matlab的优良算法,又保持了C++的高执行效率。<BR>  下面将详细介绍如何使Matlab与C++接口。<BR>  运行环境:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      Matcom 3.0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Matlab 
      5.1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Visual C++ 
      5.0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 中文Windows 
      95<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PC:486/66    </P>
      <P>&nbsp; (1)首先应设置Matcom所对应的编译器类型、数据类型。<BR>&nbsp; 
      (2)将你所需要的.M文件翻译成C源码。</P>  在这里将用一个简单的滤波器Matlab源程序:<BR>  Lin.m   
      <BLOCKQUOTE>
        <P>&nbsp;  <BR>b=[1 2 1];   <BR>a=[1 -1.58 0.64];n=50;   <BR>x=[1, 
        ones(1,n-1)];   <BR>y=filter(b,a,x);   <BR>plot(y./70,'*');   <BR>hold 
        on   <BR>plot(x,'.');   <BR>grid;  </P></BLOCKQUOTE>
      <P>    <BR>下面给出了经Matcom翻译后的C++源程序。Lin.cpp      </P>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -