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