MATLAB接口(有例子有解释)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{ double *x,*y; int mrows,ncols; /* Check for proper number of arguments. */ if(nrhs!=1) { mexErrMsgTxt("One input required."); } else if(nlhs>1) { mexErrMsgTxt("Too many output arguments"); }
发送 MATLAB 命令。 (二)MEX 文件 1、一个 MEX 的例子 #include "mex.h" /* * timestwo.c - example found in API guide * * Computational function that takes a scalar and doubles it. * * This is a MEX-file for MATLAB. * Copyright (c) 1984-1998 The MathWorks, Inc. */ /* $Revision: 1.5 $ */ /* 本 MEX 文件的目的是实现 timestwo 的功能 void timestwo(double y[], double x[])是你的 C++函数 */ void timestwo(double y[], double x[]) { y[0] = 2.0*x[0]; }
/* 在 MATLAB 命令行方式下,本 MEX 文件的调用格式是 y=timestwo(x) 输入参数(x)个数=1,输出参数(y)个数=1,所以在程序一 开始就检查 nrhs 是否=1以及 nlhs 是否>1(因为 MATLAB 有一个缺省 输出参数 ans,所以 nlhs 可以=0 */ 输出参数 ans,所以 nlhs 可以=0 */
/* 为输出创佳一个矩阵,显然这个矩阵也应该是1x1的 */ plhs[0] = mxCreateDoubleMatrix(mrows,ncols, mxREAL); /* 获得指向输入/输出矩阵数据的指针 */ x = mxGetPr(prhs[0]); y = mxGetPr(plhs[0]); /* 调用 C++函数 timestwo(y,x) */ timestwo(y,x); }
MATLAB 提供的 API 函数集封装于下面两个标准 DLL 文件中:libmat.dll, libmx.dll。前者用 于 对 MAT 文 件 的 操 作 , Baidu Nhomakorabea 者 用 于 对 MAT 文 件 中 矩 阵 的 操 作 。 他 们 的 存 放 路 径 为 : <MATLAB>\bin。
在<MATLAB>\extern\include 中有与前面两个 DLL 对应的 DEF 文件: libmat.edf, libmx.dbf。 其导出函数的原型位于同一目录下的 mat.h 和 matrix.h 中 有了这些 DLL、DEF、H 文件,该怎么用 C++调用 API 函数就不用我多说了吧。 3、MATLAB 中常用的矩阵类型 ?(复)双精度矩阵(Complex Double-Precision Matrices) MATLAB 中最常用的数据类型便是(复)双精度、非稀疏矩阵,这些矩阵的元素都是双精 度(double)的,矩阵的尺寸为 m×n,其中 m 是总行数,m 是总列数。矩阵数据实际存放 在两个双精度向量中――一个向量存放的是数据的实部,另一个向量存放的是数据的虚部。 指向这两个向量的指针一般被写做“pr” (pointer to real data,指向实数据的指针)和“pi” (pointer to imaginary data,指向虚数据的指针)”。如果一个矩阵的 pi 为空的话,说明它 是实双精度矩阵。 ?稀疏矩阵(Sparse Matrices) MATLAB 中稀疏矩阵的存储格式与众不同。如同双精度矩阵一样,它拥有参数 pr 和 pi,同 时它还具用三个附加的参数:nzmax,ir 以及 jc。 nzmax 是个整型数,其值为向量 ir 及 pr、pi(如果存在的话)可能的最大长度。它是稀疏 矩阵中不为零的元素的个数。 ir 指向一个长度为 nzmax 的整型数阵列,阵列包含的是 pr 和 pi 中对应元素的行号。 jc 指向一个长度为 N+1的整型数阵列(N 为矩阵的列数),其中包含的是列号信息。对于 任意的 j,如果0≤j≥N-1,jc[j]是第 j 列中第一个非零项在 ir、pr(以及 pi)中的序号,jc[j+1]-1 是第 j 列最后一个非零项的序号。因此 jc[N]总等于 nnz――矩阵中非零项的总个数。如果 nnz 小于 nzmax,可以继续向矩阵中添加非零项而无需分配额外的存储空间 。 4、主要函数举例: ?MATFile *matOpen(const char *filename, const char * mode)――打开/创建 ?MATFile *matOpen(const char *filename, const char * mode)――打开/创建一个 MAT 文 件; ?int matClose(MATFile *pMF)――关闭一个 MAT 文件; ?mxArray *mxCreateDoubleMatrix(int m, int n, mxComplexity flag) ――创建一个(复)双精度矩阵; ?mxArray *mxCreateSparse(int m, int n, int nzmax, mxComplexity flag) ――创建一个稀疏矩阵; ?mxArray *matGetNextArray(MATFile *pMF)――获得 MAT 文件里面下一个矩阵; ?const char *mxGetName(const mxArray *pa)――获得矩阵 pa 的名称; ?void mxSetName(mxArray *pa,const char *s)――为矩阵 pa 设置一个名称; ?int mxGetM(const mxArray *pa)――获得矩阵 pa 的总行数; ?int mxGetN(const mxArray *pa)――获得矩阵 pa 的总列数; ?double *mxGetPr(const mxArray *pa)――获得矩阵 pa 的 pr 指针; ?int *mxGetIr(const mxArray *pa)――获得稀疏矩阵 pa 的 ir 指针; ?int *mxGetJc(const mxArray *pa)――获得稀疏矩阵 pa 的 jc 指针; ?int matPutArray(MATFile * pMF, const mxArray * pA)
把上面这个文件用 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 调用 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 交换数据以及
/* The input must be a noncomplex scalar double.*/
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."); } /* 判断输入矩阵是否是 double 类,以及它是否只包括单个元素 */
/*下面这个 mexFunction 的目的是使 MATLAB 知道如何调用这个 timestwo 函数*/ void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] )
/* nlhs 是 MATLAB 命令行方式下输出参数的个数; *plhs[]是 MATLAB 命令行方式下的输出参数; nrhs 是 MATLAB 命令行方式下输入参数的个数; *prhs[]是 MATLAB 命令行方式下的输入参数; */
发送 MATLAB 命令。 (二)MEX 文件 1、一个 MEX 的例子 #include "mex.h" /* * timestwo.c - example found in API guide * * Computational function that takes a scalar and doubles it. * * This is a MEX-file for MATLAB. * Copyright (c) 1984-1998 The MathWorks, Inc. */ /* $Revision: 1.5 $ */ /* 本 MEX 文件的目的是实现 timestwo 的功能 void timestwo(double y[], double x[])是你的 C++函数 */ void timestwo(double y[], double x[]) { y[0] = 2.0*x[0]; }
/* 在 MATLAB 命令行方式下,本 MEX 文件的调用格式是 y=timestwo(x) 输入参数(x)个数=1,输出参数(y)个数=1,所以在程序一 开始就检查 nrhs 是否=1以及 nlhs 是否>1(因为 MATLAB 有一个缺省 输出参数 ans,所以 nlhs 可以=0 */ 输出参数 ans,所以 nlhs 可以=0 */
/* 为输出创佳一个矩阵,显然这个矩阵也应该是1x1的 */ plhs[0] = mxCreateDoubleMatrix(mrows,ncols, mxREAL); /* 获得指向输入/输出矩阵数据的指针 */ x = mxGetPr(prhs[0]); y = mxGetPr(plhs[0]); /* 调用 C++函数 timestwo(y,x) */ timestwo(y,x); }
MATLAB 提供的 API 函数集封装于下面两个标准 DLL 文件中:libmat.dll, libmx.dll。前者用 于 对 MAT 文 件 的 操 作 , Baidu Nhomakorabea 者 用 于 对 MAT 文 件 中 矩 阵 的 操 作 。 他 们 的 存 放 路 径 为 : <MATLAB>\bin。
在<MATLAB>\extern\include 中有与前面两个 DLL 对应的 DEF 文件: libmat.edf, libmx.dbf。 其导出函数的原型位于同一目录下的 mat.h 和 matrix.h 中 有了这些 DLL、DEF、H 文件,该怎么用 C++调用 API 函数就不用我多说了吧。 3、MATLAB 中常用的矩阵类型 ?(复)双精度矩阵(Complex Double-Precision Matrices) MATLAB 中最常用的数据类型便是(复)双精度、非稀疏矩阵,这些矩阵的元素都是双精 度(double)的,矩阵的尺寸为 m×n,其中 m 是总行数,m 是总列数。矩阵数据实际存放 在两个双精度向量中――一个向量存放的是数据的实部,另一个向量存放的是数据的虚部。 指向这两个向量的指针一般被写做“pr” (pointer to real data,指向实数据的指针)和“pi” (pointer to imaginary data,指向虚数据的指针)”。如果一个矩阵的 pi 为空的话,说明它 是实双精度矩阵。 ?稀疏矩阵(Sparse Matrices) MATLAB 中稀疏矩阵的存储格式与众不同。如同双精度矩阵一样,它拥有参数 pr 和 pi,同 时它还具用三个附加的参数:nzmax,ir 以及 jc。 nzmax 是个整型数,其值为向量 ir 及 pr、pi(如果存在的话)可能的最大长度。它是稀疏 矩阵中不为零的元素的个数。 ir 指向一个长度为 nzmax 的整型数阵列,阵列包含的是 pr 和 pi 中对应元素的行号。 jc 指向一个长度为 N+1的整型数阵列(N 为矩阵的列数),其中包含的是列号信息。对于 任意的 j,如果0≤j≥N-1,jc[j]是第 j 列中第一个非零项在 ir、pr(以及 pi)中的序号,jc[j+1]-1 是第 j 列最后一个非零项的序号。因此 jc[N]总等于 nnz――矩阵中非零项的总个数。如果 nnz 小于 nzmax,可以继续向矩阵中添加非零项而无需分配额外的存储空间 。 4、主要函数举例: ?MATFile *matOpen(const char *filename, const char * mode)――打开/创建 ?MATFile *matOpen(const char *filename, const char * mode)――打开/创建一个 MAT 文 件; ?int matClose(MATFile *pMF)――关闭一个 MAT 文件; ?mxArray *mxCreateDoubleMatrix(int m, int n, mxComplexity flag) ――创建一个(复)双精度矩阵; ?mxArray *mxCreateSparse(int m, int n, int nzmax, mxComplexity flag) ――创建一个稀疏矩阵; ?mxArray *matGetNextArray(MATFile *pMF)――获得 MAT 文件里面下一个矩阵; ?const char *mxGetName(const mxArray *pa)――获得矩阵 pa 的名称; ?void mxSetName(mxArray *pa,const char *s)――为矩阵 pa 设置一个名称; ?int mxGetM(const mxArray *pa)――获得矩阵 pa 的总行数; ?int mxGetN(const mxArray *pa)――获得矩阵 pa 的总列数; ?double *mxGetPr(const mxArray *pa)――获得矩阵 pa 的 pr 指针; ?int *mxGetIr(const mxArray *pa)――获得稀疏矩阵 pa 的 ir 指针; ?int *mxGetJc(const mxArray *pa)――获得稀疏矩阵 pa 的 jc 指针; ?int matPutArray(MATFile * pMF, const mxArray * pA)
把上面这个文件用 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 调用 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 交换数据以及
/* The input must be a noncomplex scalar double.*/
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."); } /* 判断输入矩阵是否是 double 类,以及它是否只包括单个元素 */
/*下面这个 mexFunction 的目的是使 MATLAB 知道如何调用这个 timestwo 函数*/ void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] )
/* nlhs 是 MATLAB 命令行方式下输出参数的个数; *plhs[]是 MATLAB 命令行方式下的输出参数; nrhs 是 MATLAB 命令行方式下输入参数的个数; *prhs[]是 MATLAB 命令行方式下的输入参数; */