数模论坛

 找回密码
 注-册-帐-号
搜索
热搜: 活动 交友 discuz
查看: 3750|回复: 5

MATLAB与C++的接口问题

[复制链接]
发表于 2004-6-13 06:59:07 | 显示全部楼层 |阅读模式
文章: 摘 自 北 京 理 工 大 学 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"
/*
* 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];
}

/*下 面 这 个 mexFunction的 目 的 是 使 MATLAB知 道 如 何 调 用 这 个 timestwo函 数 */
void mexFunction( int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[] )

/* nlhs是 MATLAB命 令 行 方 式 下 输 出 参 数 的 个 数 ;
*plhs[]是 MATLAB命 令 行 方 式 下 的 输 出 参 数 ;
nrhs是 MATLAB命 令 行 方 式 下 输 入 参 数 的 个 数 ;
*prhs[]是 MATLAB命 令 行 方 式 下 的 输 入 参 数 ; */

{
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文 件 的 调 用 格 式 是 y=timestwo(x)
输 入 参 数 ( x) 个 数 = 1, 输 出 参 数 ( y) 个 数 = 1, 所 以 在 程 序 一
开 始 就 检 查 nrhs是 否 = 1以 及 nlhs是 否 >1( 因 为 MATLAB有 一 个 缺 省
输 出 参 数 ans, 所 以 nlhs可 以 =0 */
输 出 参 数 ans, 所 以 nlhs可 以 =0 */
/* 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类 , 以 及 它 是 否 只 包 括 单 个 元 素 */

/* 为 输 出 创 佳 一 个 矩 阵 , 显 然 这 个 矩 阵 也 应 该 是 1x1的 */
plhs[0] = mxCreateDoubleMatrix(mrows,ncols, mxREAL);
/* 获 得 指 向 输 入 /输 出 矩 阵 数 据 的 指 针 */
x = mxGetPr(prhs[0]);
y = mxGetPr(plhs[0]);
/* 调 用 C++函 数 timestwo(y,x) */
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函 数 就 不 用 我 多 说 了 吧 。
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
 楼主| 发表于 2004-6-13 06:59:23 | 显示全部楼层
、 主 要 函 数 举 例 :
· 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)
— — 把 矩 阵 pA存 储 入 MAT文 件 pMAF;
· void mxDestroyArray(mxArray *pa)— — 释 放 矩 阵 pa( 把 它 从 内 存 中 撤 销 ) ;
5、 两 个 例 子 :
· 获 取 一 个 MAT文 件 中 第 一 个 矩 阵 的 信 息
· 获 取 一 个 MAT文 件 中 第 一 个 矩 阵 的 信 息
typedef struct {
char szFileName[256];
MATFile* pMatFile;
mxArray* pArray;
char szArrayName[64];
char szErrMsg[256];
unsigned int nArrayDim[2];
bool bIsSparse;
} MATFileStruct;

int GetMATFileStruct(MATFileStruct *pMAThdr)
{
if((pMAThdr->pMatFile=matOpen(pMAThdr->szFileName,"r"))==NULL)
{ strcpy(pMAThdr->szErrMsg,"Can't open this mat file");
return(0);
}/*打 开 一 个 MAT文 件 */

if((pMAThdr->pArray=matGetNextArray(pMAThdr->pMatFile))==NULL)
{ strcpy(pMAThdr->szErrMsg,"Can't get arrays");
matClose(pMAThdr->pMatFile);
return(0);
}/*获 取 MAT文 件 中 的 第 一 个 矩 阵 */
}/*获 取 MAT文 件 中 的 第 一 个 矩 阵 */

pMAThdr->nArrayDim[0]=mxGetM(pMAThdr->pArray); /*获 取 其 行 数 */
pMAThdr->nArrayDim[1]=mxGetN(pMAThdr->pArray); /*获 取 其 列 数 */
strcpy(pMAThdr->szArrayName,mxGetName(pMAThdr->pArray)); /*获 取 其 名 称 */
pMAThdr->bIsSparse=mxIsSparse(pMAThdr->pArray); /*判 断 它 是 否 是 系 数 矩 阵 */
mxDestroyArray(pMAThdr->pArray); /*在 内 存 中 撤 销 这 个 矩 阵 */
matClose(pMAThdr->pMatFile); /*关 闭 MAT文 件 */
return(1);
}

· 创 建 稀 疏 矩 阵 并 赋 值
int i,j,k,m,n,nzmax,*ir,*jc;
double *pr;
unsigned short *pData;
mxArray *pa; file://初 始 化 。
m=pLCMShdr->TrueHdr.nArrayDim[0]; file://获 得 原 矩 阵 行 数 。
n=pLCMShdr->TrueHdr.nArrayDim[1]; file://获 得 原 矩 阵 列 数 。
nzmax=0;

for(i=0;i<m*n;i++)
{ if(pData!=0)
nzmax++;
nzmax++;
} file://计 算 数 据 中 非 零 元 个 数 。
if(nzmax<n)
nzmax=n;

pa=mxCreateSparse(m,n,nzmax,mxREAL); /*创 建 一 个 空 的 稀 疏 矩 阵 pa。 */
mxSetName(pa,pLCMShdr->TrueHdr.szArrayName); /*为 稀 疏 矩 阵 pa设 置 名 称 。 */
pr=mxGetPr(pa); file://获 得 pa的 pr指 针 。
ir=mxGetIr(pa); file://获 得 pa的 ir指 针 。
jc=mxGetJc(pa); file://获 得 pa的 jc指 针 。

k=0;
for(j=0;j<n;j++)
{ jc[j]=k; file://jc[j]: 截 至 到 第 j列 非 零 元 的 个 数 。
for(i=0;i { if(pData!=0) file://如 果 第 j列 第 i行 的 元 素 是 个 非 零 元 。
{ ir[k]=i; file://记 录 下 第 k个 非 零 元 的 行 号 。
k++;
}
}
pData+=m; file://移 动 pData指 针 到 下 一 列 。
}

jc[n]=k; file://jc[n]等 于 矩 阵 中 非 零 元 的 个 数 。
matPutArray(pmat,pa); file://把 稀 疏 矩 阵 pa存 入 MAT文 件 pmat。
mxDestroyArray(pa); file://从 内 存 中 撤 销 矩 阵 pa。
( 五 ) 引 擎 应 用 程 序
1、 简 介
引 擎 应 用 程 序 的 实 质 是 把 MATLAB做 为 一 个 引 擎 , 它 允 许 从 你 自 己 的 C++程 序 调 用 这 个 引 擎 。 在 运 行 时 , 引 擎 作 为 一 个 进 程 单 独 运 行 , 你 的 C++程 序 也 作 为 一 个 进 程 单 独 运 行 , 二 者 可 以 通 过 进 程 间 的 通 信 机 制 进 行 交 互 。
2、 引 擎 库
MATLAB引 擎 库 包 含 了 若 干 个 控 制 MATLAB引 擎 的 函 数 , 如 下 所 示 :
engOpen 启 动 MATLAB引 擎
engClose 关 闭 MATLAB引 擎
engGetArray 从 MATLAB引 擎 中 获 取 一 个 MATLAB矩 阵
engPutArray 向 MATLAB引 擎 发 送 一 个 MATLAB矩 阵
engEvalString 执 行 于 一 个 MATLAB命 令
engOutputBuffer 创 建 一 个 存 储 MATLAB文 本 输 出 的 缓 冲 区
同 时 , 引 擎 应 用 程 序 还 可 以 使 用 前 面 提 到 的 API函 数 。
3、 一 个 例 子
从 这 个 示 例 中 , 我 们 看 出 引 擎 应 用 程 序 是 如 何 编 制 的 :
/* $Revision: 1.3 $ */
/*
* engdemo.c
*
* This is a simple program that illustrates how to call the
* MATLAB engine functions from a C program.
*
* Copyright (c) 1996-1998 The MathWorks, Inc.
* All rights reserved
*/
#include
#include
#include
#include "engine.h"
#define BUFSIZE 256
int main()
{
Engine *ep;
mxArray *T = NULL, *result = NULL;
char buffer[BUFSIZE];
double time[10] = { 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0,
8.0, 9.0 };
8.0, 9.0 };
6-6
/*
* Start the MATLAB engine locally by executing the string
* "matlab".
*
* To start the session on a remote host, use the name of
* the host as the string rather than \0
*
* For more complicated cases, use any string with whitespace,
* and that string will be executed literally to start MATLAB.
*/
if (!(ep = engOpen("\0"))) {
fprintf(stderr, "\nCan't start MATLAB engine\n");
return EXIT_FAILURE;
} /*启 动 MATLAB引 擎 */
/*
* PART I
*
* For the first half of this demonstration, we will send data
* to MATLAB, analyze the data, and plot the result.
*/
/*
/*
* Create a variable for our data.
*/
T = mxCreateDoubleMatrix(1, 10, mxREAL); /*创 建 一 个 矩 阵 */
mxSetName(T, "T"); /*设 置 矩 阵 的 名 字 为 “ T” */
memcpy((void *)mxGetPr(T), (void *)time, sizeof(time)); /*向 矩 阵 “ T” 赋 值 */
/*
* 把 矩 阵 “ T” 置 入 MATLAB引 擎
*/
engPutArray(ep, T)
/*
* Evaluate a function of time, distance = (1/2)g.*t.^2
* (g is the acceleration due to gravity).
*/
engEvalString(ep, "D = .5.*(– 9.8).*T.^2;"); /*执 行 MATLAB
命 令 : D = .5.*(– 9.8).*T.^2; */
/*
* 绘 制 图 象 .
*/
engEvalString(ep, "plot(T,D);"); /*执 行 MATLAB命 令 : 绘 图 */
engEvalString(ep, "title('Position vs. Time for a falling
object');"); /*执 行 MATLAB命 令 : 给 图 象 加 标 题 */
engEvalString(ep, "xlabel('Time (seconds)');"); /*执 行 MATLAB命 令 : 设 置 X轴 坐 标 */
engEvalString(ep, "xlabel('Time (seconds)');"); /*执 行 MATLAB命 令 : 设 置 X轴 坐 标 */
engEvalString(ep, "ylabel('Position (meters)');"); /*执 行 MATLAB命 令 : 设 置 Y轴
坐 标 */
/*
* Use fgetc() to make sure that we pause long enough to be
* able to see the plot.
*/
printf("Hit return to continue\n\n");
fgetc(stdin);
/*
* We're done for Part I! Free memory, close MATLAB engine.
*/
printf("Done for Part I.\n");
mxDestroyArray(T); /*从 内 存 中 撤 销 矩 阵 “ T” */
engEvalString(ep, "close;"); /*关 闭 刚 才 显 示 图 象 的 窗 口 */
/*
* PART II
*
* For the second half of this demonstration, we will request
* a MATLAB string, which should define a variable X. MATLAB
* will evaluate the string and create the variable. We
* will then recover the variable, and determine its type.
*/
*/
/*
* Use engOutputBuffer to capture MATLAB output, so we can
* echo it back.
*/
engOutputBuffer(ep, buffer, BUFSIZE); /*构 建 MATLAB文 本 输 入 缓 冲 区 */
while (result == NULL) {
char str[BUFSIZE];
/*
* Get a string input from the user.
*/
printf("Enter a MATLAB command to evaluate. This
command should\n");
printf("create a variable X. This program will then
determine\n");
printf("what kind of variable you created.\n");
printf("For example: X = 1:5\n");
printf(">> "); /*要 求 用 户 输 入 一 个 MATLAB命 令 */
fgets(str, BUFSIZE– 1, stdin); /*获 得 用 户 输 入 */
/*
* Evaluate input with engEvalString.
*/
engEvalString(ep, str); /*执 行 用 户 输 入 的 MATLAB命 令 */
engEvalString(ep, str); /*执 行 用 户 输 入 的 MATLAB命 令 */
/*
* Echo the output from the command. First two characters
* are always the double prompt (>>).
*/
printf("%s", buffer+2); /*显 示 该 MATLAB命 令 的 执 行 情 况 */
/*
* Get result of computation.
*/
printf("\nRetrieving X...\n");
if ((result = engGetArray(ep,"X")) == NULL) /*判 断 是 否 可 以 从 MATLAB
引 擎 中 获 得 矩 阵 “ X” */
printf("Oops! You didn't create a variable X.\n\n");
else
printf("X is class %s\t\n", mxGetClassName(result)); /*显 示 矩 阵 “ X”
的 类 型 */

} /* while(result==NULL)*/
/*
* We're done! Free memory, close MATLAB engine and exit.
*/
printf("Done!\n");
mxDestroyArray(result); /*从 内 存 中 撤 销 矩 阵 “ T” */
engClose(ep); /*关 闭 MATLAB引 擎 */
return EXIT_SUCCESS; /*返 回 */
}
4、 引 擎 应 用 程 序 的 编 译
对 于 象 上 例 中 的 控 制 台 程 序 , 可 以 在 MATLAB命 令 行 中 直 接 使 用 带 -f参 数 的 mex命 令 编 译 。
如 果 在 普 通 win32 application中 使 用 MATLAB引 擎 , 情 况 则 比 较 复 杂 。 在 Windows中 , MATLAB引 擎 是 通 过 ActiveX被 调 用 的 。 因 此 你 需 要 先 Create一 个 OLE Automation Sever和 一 个 OLE Client, 然 后 通 过 OLE方 式 调 用 这 个 MATLAB引 擎 。 具 体 做 法 可 参 阅 相 关 MATLAB随 机 文 档 。
5、 总 结
MATLAB引 擎 的 调 用 与 其 它 引 擎 ( 例 如 数 据 库 引 擎 ) 的 调 用 很 类 似 , 其 步 骤 是 联 接 \启 动 引 擎 , 然 后 向 引 擎 发 送 命 令 , 获 得 引 擎 处 理 结 果 。

结 束 语
上 面 简 要 介 绍 了 MATLAB与 C++的 几 种 接 口 方 式 , 我 们 可 以 根 据 要 求 的 不 同 采 用 相 应 的 方 式 。
此 外 , MATLAB还 提 供 了 一 个 数 学 库 , 由 此 数 学 库 , 我 们 可 以 获 得 对 MATLAB内 部 命 令 更 多 的 访 问 权 和 更 灵 活 的 访 问 方 式 。 具 体 内 容 可 参 考 MATLAB的 相 关 随 机 文 档 。
· 参 考 文 献
1、 MATLAB随 机 文 档 : apiguide.pdf
2、 MATLAB随 机 文 档 : apiref.pdf
3、 MATLAB随 机 文 档 : c_math_ref1.pdf
· 致 谢
感 谢 loverboy的 鼓 励 , 他 声 称 要 把 这 些 帖 子 放 到 他 的 主 页 上 , 才 使 得 我 能 够 在 短 时 间 完 成 这 篇 接 口 问 题 的 文 章 , 西 西 。
· 备 注
mex编 译 器 在 VC6下 的 设 置 可 参 阅 本 板 19#文
Bluesky的 意 见 :
VC程 序 员 最 好 用 visual matcom。 VB用 matrixVB mathtool在 主 页 上 提 供 免 费 试 用 , 快 去 下 吧 。 matlab的 功 能 可 在 你 的 VC,VB中 实 现 , 而 且 只 需 两 个 dll即 可 发 行 。

相 关 问 题 :
QA002610 “关于MatLab的站点” <>文章来源Sirius (天狼星) 。
</P>
发表于 2004-6-13 14:31:36 | 显示全部楼层
<>好厉害呀,</P><>你一个人发表这么多的东东</P>[em08]
发表于 2004-6-15 17:13:11 | 显示全部楼层
<>Matlab要的就是别人差不上手。</P><>关键是人家子函数多呀。不用没法子呀。</P>
发表于 2004-6-20 06:07:41 | 显示全部楼层
厉害,斑竹就是版主.
发表于 2004-11-14 06:59:28 | 显示全部楼层
<>我在机器上试了但好像行不通</P><>那个引擎到底怎么用的阿〉?</P>
您需要登录后才可以回帖 登录 | 注-册-帐-号

本版积分规则

小黑屋|手机版|Archiver|数学建模网 ( 湘ICP备11011602号 )

GMT+8, 2024-11-27 22:21 , Processed in 0.067986 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表