⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 问专家-matlab与c++的接口问题.htm

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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -