首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

介绍MATLAB与C++的几种接口方式

介绍MATLAB与C++的几种接口方式

matlab调用c++,应该用mex把cpp编译成 .mex文件供MATLAB在命令行方式下调用吧

看下面这片文章
文章: 摘自北京理工大学BBS
MATLAB是什么东东?不用我多说了,大批的高手会告诉你它的无数好处。但是MATLAB程序存在的一般问题是:
1、运算速度较慢,特别是有for i=1:???
    for j=1:???
    ......
    end
end时,那你就死定了。
2、无法脱离MATLAB环境运行,虽然你可以用MATLAB自带的工具把M文件转成可执行程序,但是执行时,你只能看到一个黑黑的窗口,难道,这就是......Windows? $%&%^$##%&。
3、GUI功能差。许多大侠不愿意看到2中所述的DOS-Windows界面,于是使用了MATLAB带的GUI生成工具。(不要扔臭鸡蛋!我知道你用Graphic Editor改了一下界面,发现以前的工作全都白做了——因为被覆盖了,西西)但是MATLAB提供的控件和事件实在有限。GUI界面做好后放在机器里,向尚未进实验室的师妹(们)炫耀一下,还勉强可以增加一些魅力值。如果被专家看到了,西西。只怕效果不太美妙。
因此,如果能够实现MATLAB与VC或者BC或者C++BUILDER等可视化设计语言的交互,提高速度,美化界面,使程序更符合Windows的规范,同时又利用MATLAB的强大功能,对任何人来说都很有意义。
我在课题中涉及到了部分MATLAB与C++的接口知识,在这里总结出来,算是抛砖引玉吧。其中错误以及偏颇的地方,尚请各位大侠以及高手多多指教,谢谢!

(一)接口种类
用C++(或者C)语言操作MATLAB,有三种途径:
·MEX文件
在MATLAB中可调用的C或Fortran语言程序称为MEX文件。MATLAB可以直接把MEX文件视为它的内建函数进行调用。MEX文件是动态链接的子例程,MATLAB解释器可以自动载入并执行它。MEX文件主要有以下用途:
对于大量现有的C或者Fortran程序可以无须改写成MATLAB专用的M文件格式而在MATLAB中执行。
对于那些MATLAB运算速度过慢的算法,可以用C或者Frotran语言编写以提高效率。
·MAT文件应用程序
MAT文件是MATLAB专用的用于保存数据至磁盘和向MATLAB导入、从MATLAB导出数据的数据文件格式。MAT文件提供了一种简便的机制,它允许你在两个平台之间以灵活的方式移动数据。而且,它还提供了一种途径来向其它单机MATLAB应用导入或者导出数据。
为了简化在MATLAB环境之外对MAT文件的使用,MATLAB给出了一个操作例程库,通过它,我们可以使用C/C++或者Fortran程序读写MAT文件。
·引擎应用程序
MATLAB提供了一系列的例程使得别的程序可以调用MATLAB,从而把MATLAB用作一个计算引擎。MATLAB引擎程序指的是那些通过管道(在UNIX系统中)或者ActiveX(在Windows系统中)与独立MATLAB进程进行通信的C/C++或者Fortran程序。
MATLAB同样提供了一个函数库来启动或者结束MATLAB进程、与MATLAB交换数据以及发送MATLAB命令。

(二)MEX文件
1、一个MEX的例子
#include "mex.h"



void timestwo(double y[], double x[])
{
y[0] = 2.0*x[0];
}
  

void mexFunction( int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[] )
  

  
{
double *x,*y;
int mrows,ncols;

if(nrhs!=1) {
mexErrMsgTxt("One input required.");
} else if(nlhs>1) {
mexErrMsgTxt("Too many output arguments");
}
  

    输出参数ans,所以nlhs可以=0 */

  
mrows = mxGetM(prhs[0]);
ncols = mxGetN(prhs[0]);
if( !mxIsDouble(prhs[0]) || mxIsComplex(prhs[0]) ||
!(mrows==1 && ncols==1) ) {
mexErrMsgTxt("Input must be a noncomplex scalar double.");
}
  

plhs[0] = mxCreateDoubleMatrix(mrows,ncols, mxREAL);

x = mxGetPr(prhs[0]);
y = mxGetPr(plhs[0]);

timestwo(y,x);
}
  
把上面这个文件用MEX编译后,MATLAB命令行下调用的实例
x = 2;
y = timestwo(x)
y =
y =
4
  
2、MEX文件的编程规则
    (1)编制自己的C++算法程序
    (2)紧跟着定义mexFunction函数,mexFunction的定义法唯一:
它只能是如下形式:
    void mexFunction( int nlhs, mxArray *plhs[],
    int nrhs, const mxArray *prhs[] )
其名称和参数类型不许有任何改变,在mexFunciton函数中可以调用你刚定义好的C++程序。
3、MEX文件的编译
MATLAB提供了专门编译MEX文件的工具:mex,它可以把你做好的C++源程序编译成 .mex文件供MATLAB在命令行方式下调用。调用时输入你的C++函数名(上例中为timestwo)。具体mex的设置和使用方法可以在MATLAB命令行方式下用help mex命令获得。

(三)MAT文件
1、概述
.MAT文件是MATLAB专用的数据存储格式,由于MATLAB提供了一套可供MATLAB调用的API函数集,所以我们完全可以在C++中访问.MAT文件。这样做的意义是:你可以把计算过程留给MATLAB,而用C++对计算结果进行分析或者可视化处理。
2、接口
MATLAB提供的API函数集封装于下面两个标准DLL文件中:libmat.dll, libmx.dll。前者用于对MAT文件的操作,后者用于对MAT文件中矩阵的操作。他们的存放路径为:<MATLAB>\bin。
在<MATLAB>\extern\include中有与前面两个DLL对应的DEF文件:
libmat.edf, libmx.dbf。 其导出函数的原型位于同一目录下的
mat.h和matrix.h中
有了这些DLL、DEF、H文件,该怎么用C++调用API函数就不用我多说了吧。
继承事业,薪火相传
返回列表