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

实现VC与Matcom的接口步骤

Posted on 2006-12-04 10:35 济公 阅读(1417) 评论(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() ;就可以了。

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