posts - 112, comments - 215, trackbacks - 0, articles - 34
  IT博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

实现VC与Matcom的接口步骤

Posted on 2006-12-04 10:35 济公 阅读(1526) 评论(0)  编辑 收藏 引用 所属分类: VCMatlab
实现 VC 与 Matcom 的接口步骤
   Matcom 是 Mathworks 公司推出的第一个由 Matlab 到 C++ 的编译开发软件平台,它的可视化界面,方便丰富的调试功能和对数学库的强大支持受到 广大技术人员的重视。现在的最高版本为 Matcom4.5 。
  我们可以通过在 Matcom 中 file 菜单下的 compile to exe or dll 调用 .m 文件编译,在 Matcom 的 debug 目录下找到生成的 cpp 、 exe 、 dll 文件。 把需要的文件加到 VC 开发环境的工程中,再包含头文件就可以实现调用。也可以直接在 VC 环境下使用科学运算库,即 Matcom 的 Matrix ,它是按照 Matcom 的语法在 VC 中实现类似于 Matlab 函数的方法。但是这里还有一种将 Matcom 集成到 VC 环境的方法,即安装 Visual Matcom 的方式,这种方式操作更加简便易行,只需要熟悉 Matlab 编程,经过简单的步骤就可以轻松实现 VC 环境中调用 Matlab 。下面介绍 Visual Matcom 开发环境的安装。

( 1 )拷贝 \bin\usertype.dat 文件(指 Matcom 的安装路径)到 \Common\MSDev98\Bin 目录(指 VC 的安装路径 ) 下。

( 2 )运行 Visual C++, 从菜单条中选择 Tools/Customize/Add-ins and Macro Files ,选择 Browse ,改变文件类型为 Add-ins(.dll) ,选定 \bin\mvcide.dll 文件,确定。

  ( 3 )这样,可以在 Visual C++ 的开发环境中看到一个如图 1 所示的 Visual Matcom 工具栏,表明安装成功。下面以一个线性方程组的求解过程为例,介绍通过 Matcom 实现 VC 对 Matlab 程序的调用,运行环境: Win2000 、 Matlab6.1 、 Matcom4.5 、 Visual C++6.0   ( 1 ) Matlab 运行环境中编写程序 equation.m ,其代码如下:                                                                                       

                                                                                          

                                                                                          

                                                                                                          %equation 求解线性方程组的解
%
线性方程组形如: A*X = B
function X = equation(A, B)
X = A\B;

                                                                                          

                                                                           

( 2 )这里以一个简单的控制台程序为例,其它程序基本相同。在 VC 环境中建立一个名为 Test 的 Win32 Console Application 工程。  ( 3 )点击 Visual Matcom 工具栏上的 m++ 图标,选择保存过的 Matlab 文件 equation.m 进行转化。如果看到的转化信息提示没有错误就可以观察到此时在 FileView 标签中多了 m-files , C++files created from m-files , Matrix 等文件。并且该工程目录下增加了 equation.h , equation.cpp , equation.mak , equation.r 等的 4 个文件。这时会在 VC 中出现一个转换完毕的文件,文件中如果报告有错误就要考虑是否程序有问题,可以双击 C++files 文件夹下的 equation.m 进行修改,再重新转化直到没有错误报告为止。

  ( 4 )在 Test 工程下建立一个文件 test.cpp 调用转化的 Matlab 函数,代码为

                                                                                     

                                                                                     

                                                                                     

                                                                                                     #include "stdio.h"
#include "matlib.h" //
提供转化后 C++ 代码中使用的数据类型,函 // 数原型及常数
#include "equation.h"
void main()
{
  /* 解线性方程组:
  X =
  */
  initM(MATCOM_VERSION); // 初始化 matlib 库
  Mm a,b,x; // 使用矩阵类 Mm 构造矩阵 a,b,x.
  a = (BR(1),2,3,semi,4,5,6,semi,7,8,1);
  // 给矩阵 a 赋值, BR 是 Matrix

            库的一个
  // 宏,用于定义一个矩阵的开始; semi 是库的 // 一个常量,用于分隔不同行的矩阵元素
  b = zeros(3,1); // 初始化矩阵 b 为零矩阵 3 行 1 列
  b(1,1) = 37; b(2,1) = 85; b(3,1) = 69; // 给矩阵 b 赋值
  x = equation(a,b); // 调用转化的函数,求解线性方程组的解
  for (int i = 1; i <= x.rows(); i++) // 把解矩阵 X 的元素显示出来
  {
   for (int j=1;j<=x.cols();j++)
    printf("x(%d,%d)=%f\n",i,j,x.r(i,j));
  }
  exitM(); // 结束对 matlib 库的调用
  return;
}

                                                                                     

                                                                      

注意:程序中涉及到了两个成员函数 .rows() 和 .cols() ,它们分别返回矩阵的行数和列数; x.r(i,j) 代表矩阵 x 的第 i 行第 j 列的元素。

( 5 )编译运行后结果为 x(1,1) = 3.000000 x(2,1) = 5.000000 x(3,1) = 8.000000 与实际结果一致。

  总结:如果需要转换的 .m 文件不是一个函数,只是一些 Matlab 命令的集合,则要在工程目录下找到转换文件的 .cpp 文件,将其中的 C 代码

拷贝到需要调用它的函数里面。 Matcom 克服了 mcc 命令只能编译一个独立 .m 文件的缺点,当所编译的 .m 文件依赖于其他 .m 文件时,只要把被调用的 .m 文件与要编译的 .m 文件放在同一目录下,生成的被调用文件的 .h 和 .cpp 文件插入到 VC 开发的工程中就可以了。  上面只是一个简单的控制台工程的例子,我们也可以建立其它类型的工程,只要在需要调用转换后函数的程序中包含 matlib.h 并且在响应函数中初始化 matlib 库 initM(MATCOM_VERSION) ;结束调用后做结束工作 exitM() ;就可以了。

 
只有注册用户登录后才能发表评论。