📄 问专家-matlab与c++的接口问题.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0044)http://www.china-askpro.com/msg27/qa98.shtml -->
<HTML><HEAD><TITLE>问专家-MATLAB与C++的接口问题</TITLE>
<META content="text/html; charset=gb2312" http-equiv=Content-Type>
<META
content="编程, 源程序, programming, source code, C/C++, MFC, C++ Builder, Borland C++, Turbo C, C, BCB, 其他方面, "
name=keywords><!--#include virtual="../QuestionHeader.html" -->
<META content="MSHTML 5.00.3315.2870" name=GENERATOR></HEAD>
<BODY>
<H3 align=center><FONT color=#009900>MATLAB与C++的接口问题</FONT></H3>
<P><FONT size=-1><BR></FONT>
<P><FONT size=-1><B>编号:</B>QA002698<BR><B>建立日期: </B>2000年3月11日
<B>最后修改日期:</B>2000年3月30日 <BR></FONT><FONT size=-1><B>所属类别:</B> </FONT>
<UL><FONT size=-1><I><A href="http://www.china-askpro.com/cpp.shtml">C/C++ -
其他方面</A><BR></I></FONT></UL>
<P><FONT color=#660000 size=-1><IMG height=32
src="问专家-MATLAB与C++的接口问题.files/a.gif" width=32><B>文章</B>: </FONT>
<P><FONT size=-1> 摘自北京理工大学BBS
<BR> MATLAB是什么东东?不用我多说了,大批的高手会告诉你它的无数好处。但是MATLAB程序存在的一般问题是:
<BR> 1、运算速度较慢,特别是有for i=1:???
<BR> for j=1:??? <BR> ......
<BR> end <BR> end时,那你就死定了。
<BR> 2、无法脱离MATLAB环境运行,虽然你可以用MATLAB自带的工具把M文件转成可执行程序,但是执行时,你只能看到一个黑黑的窗口,难道,这就是......Windows?
$%&%^$##%&。
<BR> 3、GUI功能差。许多大侠不愿意看到2中所述的DOS-Windows界面,于是使用了MATLAB带的GUI生成工具。(不要扔臭鸡蛋!我知道你用Graphic
Editor改了一下界面,发现以前的工作全都白做了——因为被覆盖了,西西)但是MATLAB提供的控件和事件实在有限。GUI界面做好后放在机器里,向尚未进实验室的师妹(们)炫耀一下,还勉强可以增加一些魅力值。如果被专家看到了,西西。只怕效果不太美妙。
<BR> 因此,如果能够实现MATLAB与VC或者BC或者C++BUILDER等可视化设计语言的交互,提高速度,美化界面,使程序更符合Windows的规范,同时又利用MATLAB的强大功能,对任何人来说都很有意义。
<BR> 我在课题中涉及到了部分MATLAB与C++的接口知识,在这里总结出来,算是抛砖引玉吧。其中错误以及偏颇的地方,尚请各位大侠以及高手多多指教,谢谢!
<BR> (一)接口种类
<BR> 用C++(或者C)语言操作MATLAB,有三种途径:
<BR> ·MEX文件
<BR> 在MATLAB中可调用的C或Fortran语言程序称为MEX文件。MATLAB可以直接把MEX文件视为它的内建函数进行调用。MEX文件是动态链接的子例程,MATLAB解释器可以自动载入并执行它。MEX文件主要有以下用途:
<BR> 对于大量现有的C或者Fortran程序可以无须改写成MATLAB专用的M文件格式而在MATLAB中执行。
<BR> 对于那些MATLAB运算速度过慢的算法,可以用C或者Frotran语言编写以提高效率。
<BR> ·MAT文件应用程序
<BR> MAT文件是MATLAB专用的用于保存数据至磁盘和向MATLAB导入、从MATLAB导出数据的数据文件格式。MAT文件提供了一种简便的机制,它允许你在两个平台之间以灵活的方式移动数据。而且,它还提供了一种途径来向其它单机MATLAB应用导入或者导出数据。
<BR> 为了简化在MATLAB环境之外对MAT文件的使用,MATLAB给出了一个操作例程库,通过它,我们可以使用C/C++或者Fortran程序读写MAT文件。
<BR> ·引擎应用程序
<BR> MATLAB提供了一系列的例程使得别的程序可以调用MATLAB,从而把MATLAB用作一个计算引擎。MATLAB引擎程序指的是那些通过管道(在UNIX系统中)或者ActiveX(在Windows系统中)与独立MATLAB进程进行通信的C/C++或者Fortran程序。
<BR> MATLAB同样提供了一个函数库来启动或者结束MATLAB进程、与MATLAB交换数据以及发送MATLAB命令。
<BR> (二)MEX文件 <BR> 1、一个MEX的例子
<BR> #include "mex.h" <BR> /*
<BR> * timestwo.c - example found in API guide
<BR> * <BR> * Computational
function that takes a scalar and doubles it. <BR> *
<BR> * This is a MEX-file for MATLAB.
<BR> * Copyright (c) 1984-1998 The MathWorks, Inc.
<BR> */ <BR> /* $Revision: 1.5 $
*/ <BR> /* 本MEX文件的目的是实现timestwo的功能
<BR> void timestwo(double y[], double x[])是你的C++函数 */
<BR> void timestwo(double y[], double x[])
<BR> { <BR> y[0] = 2.0*x[0];
<BR> } <BR>
<BR> /*下面这个mexFunction的目的是使MATLAB知道如何调用这个timestwo函数*/
<BR> void mexFunction( int nlhs, mxArray *plhs[],
<BR> int nrhs, const mxArray *prhs[] )
<BR> <BR> /*
nlhs是MATLAB命令行方式下输出参数的个数; <BR>
*plhs[]是MATLAB命令行方式下的输出参数; <BR>
nrhs是MATLAB命令行方式下输入参数的个数; <BR>
*prhs[]是MATLAB命令行方式下的输入参数; */ <BR>
<BR> { <BR> double *x,*y;
<BR> int mrows,ncols; <BR> /*
Check for proper number of arguments. */ <BR> if(nrhs!=1)
{ <BR> mexErrMsgTxt("One input required.");
<BR> } else if(nlhs>1) {
<BR> mexErrMsgTxt("Too many output arguments");
<BR> } <BR>
<BR> /* 在MATLAB命令行方式下,本MEX文件的调用格式是y=timestwo(x)
<BR> 输入参数(x)个数=1,输出参数(y)个数=1,所以在程序一
<BR> 开始就检查nrhs是否=1以及nlhs是否>1(因为MATLAB有一个缺省
<BR> 输出参数ans,所以nlhs可以=0 */ <BR>
输出参数ans,所以nlhs可以=0 */ <BR> /* The input must be a
noncomplex scalar double.*/ <BR>
<BR> mrows = mxGetM(prhs[0]); /* 获得输入矩阵的行数 */
<BR> ncols = mxGetN(prhs[0]); /* 获得输入矩阵的列数 */
<BR> if( !mxIsDouble(prhs[0]) || mxIsComplex(prhs[0]) ||
<BR> !(mrows==1 && ncols==1) ) {
<BR> mexErrMsgTxt("Input must be a noncomplex scalar
double."); <BR> } /* 判断输入矩阵是否是double类,以及它是否只包括单个元素 */
<BR> <BR> /*
为输出创佳一个矩阵,显然这个矩阵也应该是1x1的 */ <BR> plhs[0] =
mxCreateDoubleMatrix(mrows,ncols, mxREAL); <BR> /*
获得指向输入/输出矩阵数据的指针 */ <BR> x = mxGetPr(prhs[0]);
<BR> y = mxGetPr(plhs[0]); <BR> /*
调用C++函数timestwo(y,x) */ <BR> timestwo(y,x);
<BR> } <BR>
<BR> 把上面这个文件用MEX编译后,MATLAB命令行下调用的实例
<BR> x = 2; <BR> y = timestwo(x)
<BR> y = <BR> y =
<BR> 4 <BR>
<BR> 2、MEX文件的编程规则 <BR>
(1)编制自己的C++算法程序 <BR>
(2)紧跟着定义mexFunction函数,mexFunction的定义法唯一: <BR> 它只能是如下形式:
<BR> void mexFunction( int nlhs, mxArray *plhs[],
<BR> int nrhs, const mxArray *prhs[] )
<BR> 其名称和参数类型不许有任何改变,在mexFunciton函数中可以调用你刚定义好的C++程序。
<BR> 3、MEX文件的编译
<BR> MATLAB提供了专门编译MEX文件的工具:mex,它可以把你做好的C++源程序编译成
.mex文件供MATLAB在命令行方式下调用。调用时输入你的C++函数名(上例中为timestwo)。具体mex的设置和使用方法可以在MATLAB命令行方式下用help
mex命令获得。 <BR> (三)MAT文件 <BR> 1、概述
<BR> .MAT文件是MATLAB专用的数据存储格式,由于MATLAB提供了一套可供MATLAB调用的API函数集,所以我们完全可以在C++中访问.MAT文件。这样做的意义是:你可以把计算过程留给MATLAB,而用C++对计算结果进行分析或者可视化处理。
<BR> 2、接口
<BR> MATLAB提供的API函数集封装于下面两个标准DLL文件中:libmat.dll,
libmx.dll。前者用于对MAT文件的操作,后者用于对MAT文件中矩阵的操作。他们的存放路径为:<MATLAB>\bin。
<BR> 在<MATLAB>\extern\include中有与前面两个DLL对应的DEF文件:
<BR> libmat.edf, libmx.dbf。 其导出函数的原型位于同一目录下的
<BR> mat.h和matrix.h中
<BR> 有了这些DLL、DEF、H文件,该怎么用C++调用API函数就不用我多说了吧。
<BR> 3、MATLAB中常用的矩阵类型
<BR> ·(复)双精度矩阵(Complex Double-Precision Matrices)
<BR> MATLAB中最常用的数据类型便是(复)双精度、非稀疏矩阵,这些矩阵的元素都是双精度(double)的,矩阵的尺寸为m×n,其中m是总行数,m是总列数。矩阵数据实际存放在两个双精度向量中——一个向量存放的是数据的实部,另一个向量存放的是数据的虚部。指向这两个向量的指针一般被写做“pr”
(pointer to real data,指向实数据的指针)和“pi” (pointer to imaginary
data,指向虚数据的指针)”。如果一个矩阵的pi为空的话,说明它是实双精度矩阵。
<BR> ·稀疏矩阵(Sparse Matrices)
<BR> MATLAB中稀疏矩阵的存储格式与众不同。如同双精度矩阵一样,它拥有参数pr和pi,同时它还具用三个附加的参数:nzmax,ir以及jc。
<BR> nzmax是个整型数,其值为向量ir及pr、pi(如果存在的话)可能的最大长度。它是稀疏矩阵中不为零的元素的个数。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -