matlab功能很强,但是也许有的人会觉得安装完了之后占用空间太大,很不爽。这次呢就介绍一个叫做matcom的工具,它安装完成之后也就8M左右,可以完全脱离matlab平台自主编辑、运行m文件等,非常方便。最主要的是它可以很方便的实现与VC的混合编程。我使用的matcom版本是4.5。
1、matcom安装
安装时会要求选择编译complier,如果你装是VS的话,就只有选择VS9.0/VC/bin/c1.exe了,这样也能安装成功,但是安装之后结果不对,连最基本的加法计算都不能得到结果。Matcom的安装是需要有VC的支持的,所以必须安装VC6.0,然后在matcom安装时的complier选择VC6安装目录下VC98/bin/c1.exe就可以了(一般安装时自动搜索)。
VC6安装matcom插件:在VC6运行界面选择工具à定制à附加项和宏文件à浏览然后选择…matcom45\bin\mvcide.dll进行添加就可以了。之后就会在VC的界面上出现这个小工具。插件安装成功。
2、matcom4.5与VC混合编程
(1)自定义m函数或命令文件。
安装matcom4.5之后,在VC++环境中添加mvcide.dll之后,会出现工具,编写m文件之后,再VC工程中直接用m++添加m文件,会自动编译成cpp文件和h文件。
(2)调用库函数
可以根据matlib.h头文件中的定义的函数进行调用,在VS与matcom混合编程中详述。
3、matcom4.5与VS2008混合编程
(1)首先是在matcom环境下写好m函数文件,然后编译,编译时用下图所示的方式。
用这种方式不需要提供运行命令代码,如果是直接从“file”菜单编译的话,则需要提供运行命令代码,如下图所示。
编译之后就可以生成cpp文件和h文件。把这些文件拷贝到VS解决方案的根目录中去,然后把matcom安装根目录下的matlib.h和v4501v.lib文件也拷贝到解决方案的根目录下去,在解决方案中红把这些文件包含进来。然后写程序就可以了,程序的具体实例可以参看2010-12-8的总结。
(2)数据接口
在C++中用的数据类型是Mm类,这个类的具体内容在matlib.h文件中,这里不详细叙述。
4、直接调用matlib.h库中的函数
这里用plot函数为例,建立MFC解决方案,把matlib.h和v4501v.lib文件拷贝到解决方案目录下,加载到解决方案中去。编写这样的函数
void CtestMatcomDrawDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
initM(MATCOM_VERSION); //初始化matcom库函数
if(isInitMatcom == true) //isInitMatcom是一个是否已经画图的flag,如果已经画过就置真,然后在画图之前用clf清除原图;否则为假。
{
clf();
}
CWnd *p1 = NULL;
p1=(CWnd *)GetDlgItem(IDC_DRAWPIC); //得到用于显示图像Static text控件的ID
Mm plothandle = winaxes(p1->m_hWnd); //将Static text的句柄设置赋给画图句柄
//这部分代码是对图的修饰
title((CL(TM("COS函数图形和sin函数图形"))));
xlabel((CL(TM("x"))));
ylabel((CL(TM("y"))));
set(plothandle,(CL(TM("Color")),TM("black")));
set(plothandle,(CL(TM("Box")),TM("on")));
//下面的代码就是确定要画的数据
Mm x,y;
x=linspace(m_X1 * pi, m_X2 * pi, 100);
y=mcos(x);
plot((CL(x), y, TM("y")));
y=msin(x);
plot(( CL(x), y, TM("y")));
isInitMatcom = true;
exitM();//结束库函数的调用
}
上面的例子是画的余弦函数和正弦函数的曲线,所用的这些函数都是matlib.h文件中有的,这些函数的用法和matlab中基本一致。这里详细介绍这两个:linspace(), plot()。
linspace(x1, x2, n)是建立一个起点在x1,终点在x2的向量,向量共n个点。Linspace()的重载格式还有Mm DLLI linspace(cMm x1, cMm x2);//x1是起点,x2是终点,如果二者间隔稍大就会自动分为101个点
还有其他的格式,这里不再赘述。
Plot()函数就是绘制曲线的函数了,它只接受一个参数,原型为Mm DLLI plot(cMm varargin);如果使用plot((CL(y)));的方式,纵坐标是y的范围,曲线是y的曲线,横坐标根据y的点数来定,例如若y有101个点,则横坐标就是从0到100;如果有专门想用来作为横坐标的向量数据,则应采用这种函数方式plot((CL(x), y));。还可以对曲线进行修饰,如plot((CL(x), y, TM("y")));则是绘制曲线颜色为黄色。
程序运行结果如下:
如果想在没有安装matcom的电脑上运行此程序,只需将matcom安装目录下的matlib.h、v4501v.lib以及系统目录下的v4501v.dll、ago4501.dll文件拷贝到工程目录下就可以。
5、一些限制
(1)因为matcom做的太成功了,威胁到了matlab,现已经被malab收够了,所以matcom最高版本就是4.5了,以后matlab有什么更新matcom不能及时跟上步伐。(2)因为matcom是基于VC的,所以与VS C++混合编程时会有一些小问题,主要是matlib.h中的ans定义和math.h中的abs定义重复,具体原因这里不再详述,只要把matlib中的重定义的abs注释掉就可以。
(3)安装matcom时必须已经安装了VC。
(4)matcom和VS C++混合编程时,需要手动编译,不如在VC下方便。而且matcom不支持C#。
以上就是在做matcom和VS C++混合编程时的一些心得体会,如果说的不对的地方,也请指正。如果各位有什么好的matlab 和VS混合编程的好方法,如果愿意的话,也希望多多指教。
图片来自StayReal官网~