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

📄 matlab与vc集成.htm

📁 VC与Matlab混合编程文章.
💻 HTM
📖 第 1 页 / 共 2 页
字号:
      <P class=a14><B>Matlab Add-in</B> 
      <P class=a14>Matlab 
      6.0以后版本对其Compiler作了较大的改进,其支持更多的数据类型,更强的优化功能,更为重要的是其Matlab 
      Add-in提供了一个Matlab和VC直接集成的途径。它具有一些新的特征:快速集成M文件到C++工程中,创建独立的 C/C++应用程序或C MEX 
      DLL;通过M文件创建共享库或MEX文件;内含Visual Matrix Viewer,调试过程中可以查看矩阵变量的值; 
      直接修改M源文件而不是修改生成的C/C++文件;方便快捷地打包应用程序等。 
      <P class=a14>Matlab Add-in的安装: 
      <P class=a14>1. 
      启动Matlab,运行“mex-setup”,按照菜单提示选取MSVC。它将配置MEX使用MSVC为默认的编译器(创建C-MEX文件必需),并安装Matlab 
      Add-in所需文件到MSVC目录。 
      <P class=a14>2. 在Matlab环境下运行“mbuild-setup”, 
      按提示选取MSVC。它将配置使用MSVC为默认的编译器(创建独立应用程序必需),并安装Matlab Add-in所需的Matlab 
      Compiler和C/C++数学库文件到MSVC目录。 
      <P class=a14>3. 
      在Matlab环境下运行“cd(prefdir)”和“mccsavepath”。它将保存当前Matlab路径到mccpath文件中,这是因为Matlab 
      Add-in脱离Matlab运行,否则它无从知道Matlab路径。 
      <P class=a14>4. 在MSVC环境中配置Matlab Add-in,方法是:从菜单“Tools -&gt; 
      Customize”选择“Add-ins and Macro Files”选项卡,选中“Matlab Add-in”, 
      点击“Close”。MSVC工具栏出现Matlab Add-in图标,以后每次启动VC,自动加载Matlab Add-in。 
      <P class=a14>5. 配置Windows系统。在Windows 95/98系统下,找到config.sys, 添加一行:shell= 
      c:\ command.com /e:32768 /p(Windows 
      ME有所不同,需设置Conagent.exe的属性Memory选项卡的Initial 
      Environment值为4096)。从表面看,VC的环境设置也是步骤较多,但只需设置一次。 
      <P class=a14><B>程序示例</B> 
      <P 
      class=a14>下面以创建一个Standalone程序为例具体说明。启动MSVC,打开“File-&gt;New”菜单,选择Project,选择“Matlab 
      Project Wizard”, Project Name命名为Mytest, 点击Next,你可以选择所生成的应用程序的类型:Windows 
      Console EXE、C-MEX DLL、M-MEX DLL、Shared M-DLL; 
      C程序还是C++程序;选取Debug、Release模式;选择是否生成Main函数;是否需要支持图形。这里选择生成C++程序,其余采取默认设置,点击“Finish”,出现对话框要求选择添加到工程中的M源文件,选择文件testplot.m后,这时你可以看到MSVC调用MCC生成一个混合M文件和C的工程。在“File 
      View”选项卡中可以看到添加的M文件和自动生成的C++文件。 
      <P class=a14>这时大功告成,即可按F7编译后按F5运行了,运行结果如下图所示。 
      <P><IMG align=right src="Matlab与VC集成.files/c05_2t1.jpg"> 
      <P class=a14><B>程序运行结果</B> 
      <P class=a14>这里用到的testplot.m内容如下(先在Matlab里编辑好): 
      <P class=a14>function mytest() 
      <P class=a14>t=0: 0.05*pi: 2*pi; 
      <P class=a14>y=sin(t); 
      <P class=a14>plot(t,y,‘b*’); 
      <P class=a14>可以通过双击Matlab 
      M-files文件夹下testplot.m打开观察。生成的testplot.cpp代码如下(略有删节): 
      <P class=a14>// MATLAB Compiler: 2.1 Date: Sat Nov 03 16:37:08 2001 
      <P class=a14>#include “testplot.hpp” 
      <P class=a14>#include “libmatlbm.hpp” 
      <P class=a14>static double _array0_[41] = { 0.0,.157,....}; 
      <P class=a14>//自动生成的数组 
      <P class=a14>void InitializeModule_testplot() { 
      <P class=a14>} 
      <P class=a14>void TerminateModule_testplot() { 
      <P class=a14>} 
      <P class=a14>static void Mtestplot(); 
      <P class=a14>_mexLocalFunctionTable _local_function_ 
      <P class=a14>table_testplot = { 0, (mexFunctionTableEntry *)NULL }; 
      <P class=a14>void mlxTestplot(int nlhs, mxArray * plhs[], int nrhs, 
      mxArray * prhs[]) { 
      <P class=a14>MW_BEGIN_MLX(); 
      <P class=a14>{ 
      <P class=a14>if (nlhs &gt; 0) { 
      <P class=a14>error(mwArray(“Run-time Error: File: testplot Line: 1 Column: 
      1 The function \‘testplot\’was called with more than the declared number 
      of outputs (0). ”)); 
      <P class=a14>} 
      <P class=a14>if (nrhs &gt; 0) { 
      <P class=a14>error(mwArray(“Run-time Error: File: testplot Line: 1 Column: 
      1 The function \‘testplot\’ was called with more than the declared number 
      of inputs (0).”)); 
      <P class=a14>} 
      <P class=a14>Mtestplot(); 
      <P class=a14>} 
      <P class=a14>MW_END_MLX(); 
      <P class=a14>} 
      <P class=a14>#line 1 “D:\\ygbtest\\testplot.m” 
      <P class=a14>static void Mtestplot() { 
      <P class=a14>#line 1 “D:\\ygbtest\\testplot.m” 
      <P class=a14>mclMlineEnterFunction(“D:\\ygbtest\\testplot 
      <P class=a14>.m”, “testplot”) 
      <P class=a14>#line 1 “D:\\ygbtest\\testplot.m” 
      <P class=a14>mwLocalFunctionTable save_local_ 
      <P class=a14>function_table_(&amp;_local_function_table_testplot); 
      <P class=a14>#line 1 “D:\\ygbtest\\testplot.m” 
      <P class=a14>mwArray ans(mclGetUninitializedArray()); 
      <P class=a14>#line 1 “D:\\ygbtest\\testplot.m” 
      <P class=a14>mwArray y(mclGetUninitializedArray()); 
      <P class=a14>#line 1 “D:\\ygbtest\\testplot.m” 
      <P class=a14>mwArray t(mclGetUninitializedArray()); 
      <P class=a14>// t=0: 0.05*pi: 2*pi; 
      <P class=a14>// 
      <P class=a14>#line 2 “D:\\ygbtest\\testplot.m” 
      <P class=a14>mclMline(2); 
      <P class=a14>#line 2 “D:\\ygbtest\\testplot.m” 
      <P class=a14>t = mwArray(1, 41, _array0_, (double *)NULL); 
      <P class=a14>// 
      <P class=a14>// y=sin(t); 
      <P class=a14>// 
      <P class=a14>#line 3 “D:\\ygbtest\\testplot.m” 
      <P class=a14>mclMline(3); 
      <P class=a14>#line 3 “D:\\ygbtest\\testplot.m” 
      <P class=a14>y = sin(mwVv(t,“t”)); 
      <P class=a14>// 
      <P class=a14>// plot(t,y,‘b*’); 
      <P class=a14>// 
      <P class=a14>#line 4 “D:\\ygbtest\\testplot.m” 
      <P class=a14>mclMline(4); 
      <P class=a14>#line 4 “D:\\ygbtest\\testplot.m” 
      <P class=a14>ans.EqAns(Nplot(0, mwVarargin(mwVv(t, “t”), mwVv(y, “y”), 
      “b*”))); 
      <P class=a14>#line 4 “D:\\ygbtest\\testplot.m” 
      <P class=a14>mclMlineExitFunction(); 
      <P class=a14>#line 4 “D:\\ygbtest\\testplot.m” 
      <P class=a14>} 
      <P class=a14>自动生成的testplot_mainhg.cpp代码如下: 
      <P class=a14>#include “matlab.hpp” 
      <P class=a14>//加入Matlab头文件 
      <P class=a14>#include “libsglinit.hpp” 
      <P class=a14>#include “testplot.hpp” 
      <P class=a14>//加入应用程序头文件 
      <P class=a14>static mexFunctionTableEntry function_table[1] = { { 
      “testplot”, mlxTestplot, 0, 0, &amp;_local_function_table_testplot } }; 
      <P class=a14>static _mexcppInitTermTableEntry init_term_table[1] = { { 
      InitializeModule_testplot, TerminateModule_testplot } }; 
      <P class=a14>static _mexcpp_information _main_info = { 1, 1, 
      function_table, 0, NULL, 0, NULL, 1, init_term_table }; 
      <P 
      class=a14>可以看到没有添加一句C/C++代码,即生成了一个Matlab的Standalone应用程序(是不是太容易啦)。需要注意两点: 
      一是添加到MSVC工程的文件应当为一个函数文件,而不能是一个Script文件,否则会出现错误提示; 
      二是最好不要修改生成的C/C++代码,如果需要改动,可以通过在MSVC工作区中直接修改M文件(无须在Matlab环境中),重新编译即可。你可以通过在M文件中设置断点,在运行中通过Matrix 
      Viewer观察Matlab变量的值。 
      <P 
      class=a14>目前通过Add-in实现Matlab与VC的混合编程也有一定的不足:如目前并不支持所有的Matlab的函数;生成的程序代码有些繁杂等。估计Matlab 
      6.0以后的版本在这方面肯定有所改进的。 
      <P class=a14><B>结 论</B> 
      <P class=a14>Matlab 
      Add-in提供了一种实现Matlab和VC混合编程的直接集成的途径,通过它可以很方便地生成Matlab和VC的混合程序。在图像处理等需要大量计算的工程应用场合有广泛的应用价值。 

      <P align=right>(计算机世界报 第51期 C15、C16) </P></TD></TR></TBODY></TABLE>
<TABLE align=center width=680>
  <TBODY>
  <TR>
    <TD>
      <HR color=#f46240 SIZE=1 width=660>
    </TD></TR></TBODY></TABLE><BR>
<P align=center>Copyright(C) ccw.com.cn,All rights reserved</P>
<P align=center><B>中国计算机世界出版服务公司版权所有</B></P></CENTER></BODY></HTML>

⌨️ 快捷键说明

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