加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Matlab Engine API介绍

(2011-04-23 22:50:34)
标签:

matlab

vc

engine

api

vc6.0

混合编程

it

分类: matlab
来自:
MATLAB与VC混合编程指导书

在调用 Matlab 引擎之前,首先应在相关文件中加入一行: #include "enging.h" ,该文件包含了引擎 API 函数的说明和所需数据结构的定义。可以在 VC 中调用的引擎函数分别如下:

1、引擎的打开和关闭

  engOpen -打开 Matlab engine

  函数声明:

Engine *engOpen(const char *startcmd);

参数 startcmd 是用来启动 Matlab 引擎的字符串参数,在 Windows 操作系统中只能为 NULL

函数返回值是一个 Engine 类型的指针,它是在 engine.h 中定义的 engine 数据结构。

EngClose -关闭 Matlab 引擎
  函数声明:

int engClose(Engine *ep);

参数 ep 代表要被关闭的引擎指针。

函数返回值为 0 表示关闭成功,返回 1 表示发生错误。

例如,通常用来打开 / 关闭 Matlab 引擎的代码如下:

Engine *ep; // 定义 Matlab 引擎指针。
if (!(ep=engOpen(NULL))) //
测试是否启动 Matlab 引擎成功。
{
MessageBox("Can't start Matlab engine!" );
exit(1);
}
. …………
engClose(ep); //
关闭 Matlab 引擎。

2 Matlab 发送命令字符串

  engEvalString -发送命令让 Matlab 执行。
  函数声明:

int engEvalString(Engine *ep, Const char *string);

  参数 ep 为函数 engOpen 返回的引擎指针,字符串 string 为要 matlab 执行的命令。
  函数返回值为 0 表示成功执行,返回 1 说明执行失败(如命令不能被 Matlab 正确解释或 Matlab 引擎已经关闭了)。
3
获取 Matlab 命令窗口的输出
  要在 VC 中获得函数 engEvalString 发送的命令字符串被 Matlab 执行后在 matlab 窗口中的输出,可以调用 engOUtputBuffer 函数。
  函数声明:

int engOutputBuffer(Engine *ep, char *p, int n);

  参数 ep Matlab 引擎指针, p 为用来保存输出结构的缓冲区, n 为最大保存的字符个数,通常就是缓冲区 p 的大小。该函数执行后,接下来的 engEvalString 函数所引起的命令行输出结果会在缓冲区 p 中保存。如果要停止保存,只需调用代码:engOutputBuffer(ep, NULL, 0)
4
、读写 Matlab 数据
  从 Matlab 引擎工作空间中获取变量。

mxArray *engGetVariable(Engine *ep, const char *name);

  参数 ep 为打开的 Matlab 引擎指针, name 为以字符串形式指定的数组名。
  函数返回值是指向name 数组的指针,类型为mxArray* mxArray 数据类型在本文后面详细简介)。
  向 Matlab 引擎工作空间写入变量。

int engPutVariable(Engine *ep, const char *name, const mxArray *mp);

  参数 ep 为打开的 Matlab 引擎指针, mp 为指向被写入变量的指针, name 为变量写入后在 Matlab 引擎工作空间中的变量名。
函数返回值为 0 表示写入变量成功,返回值为 1 表示发生错误。
5
调用引擎时显示 / 隐藏 Matlab 主窗口
  默认情况下,以engine 方式调用 Matlab 的时候,会打开 Matlab 主窗口,可在其中随意操作。但有时也会干扰应用程序的运行,可用以下设置是否显示该窗口。

int engSetVisible(Engine *ep, bool value);

  参数 ep 为打开的 Matlab 引擎指针, value 为是否显示的标志,取值 true (或 1 )表示显示 Matlab 窗口,取值 false (或 0 )表示隐藏 Matlab 窗口。
  函数返回值为 0 表示设置成功,为 1 表示有错误发生。
  要获得当前 Matlab 窗口的显示 / 隐藏情况,可以调用函数:

int engGetVisible(Engine *ep, bool *value);

参数 ep 为打开的 Matlab 引擎指针, Value 为用来保存显示 / 隐藏情况的变量(采用指针方式传递)。
  函数返回值为 0 表示获取成功,为 1 表示有错误发生。

6、数据类型 mxArray 的操作
  在上面的 Matlab 引擎函数中,所有与变量有关的数据类型都是 mxArray 类型。数据结构 mxArray 以及大量的 mx 开头的函数,广泛用于 Matlab 引擎程序和 Matlab C 数学库中。 mxArray 是一种很复杂的数据结构,与 Matlab 中的 array 相对应,我们只需熟悉 Matlab array 类型和几个常用的 mxArray 函数即可。
  在 VC 中,所有和 Matlab 的数据交互都是通过 mxArray 来实现的,在使用 mxArray 类型的程序中,应包含头文件 matrix.h ,不过在引擎程序中,一般会包含头文件 engine.h ,该文件里面已经包含了 matrix.h ,因此无需重复包含。
   6.1 创建和清除 mxArray 型数据
   Matlab 有很多种变量类型,对应于每种类型,基本上都有一个函数用于创建,但它们都有相同的数据结构,就是 mxArray
  数组的建立采用mxCreatexxx 形式的函数,例如新建一个double 类型数组,可用函数mxCreateDoubleMatrix ,函数形式如下:

mxArray *mxCreateDoubleMatrix(int m, int n, mxComplexity ComplexFlag);

  参数 m n 为矩阵的函数和列数。 ComplexFlag 为常数,用来区分矩阵中元素是实数还是复数,取值分别为 mxREAL mxCOMPLEX
  例如,创建一个 3 5 列的二维实数数组,可用如下语句:

mxArray *T = mxCreateDoubleMatrix(3, 5, mxREAL);


  对应的,要删除一个数组mxDestroyArray ,该函数声明如下:

void mxDestroyArray(mxArray *array_ptr);

  参数 array_ptr 为要删除的数组指针。
  例如,要删除上面创建的数组 T ,可用如下语句:

mxDestroyArray(T);

  类似的创建函数还有:

mxArray *mxCreateString(const char *str);

  创建一个字符串类型并初始化为 str 字符串。
  一般的在 VC Matlab 交互中,以上两种类型就够了,其它类型数组的创建这里不再介绍。
   6.2 管理 mxArray 数据类型
    6.2.1管理 mxArray 数据大小
  要获得 mxArray 数组每一维上元素的个数,可以用 mxGetM mxGetN 函数。其中 mxGetM 用来获得数组第一维的元素个数,对于矩阵来说就是行数。

int mxGetM(const mxArray *array_ptr); // 返回 array_ptr 对应数组第一维的元素个数(行数)
int mxGetN(const mxArray *array_ptr); //
返回 array_ptr 对应数组其它维的元素个数,对于矩阵来说是列数。对于多维数组来说是从第 2 维到最后一维的各维元素个数的乘积。

  要获得某一特定维的元素个数,则要用函数:

const int *mxGetDimensions(const mxArray *array_ptr);

  该函数返回array_ptr 各维的元素个数保存在一个int 数组中返回。对于常用的矩阵来说,用 mxGetM mxGetN 两个函数就可以了。
  另外还可以通过mxGetNumberOfDimensions 来获得数组的总的维数,用 mxSetM mxSetN 设置矩阵的行数和列数,函数说明如下:

int mxGetNumberOfDimensions(const mxArray *array_ptr); // 返回数组的维数
void mxSetM(mxArray *array_ptr, int m); //
设置数组为 m
void mxSetN(mxArray *array_ptr, int n); //
设置数组为 n

   6.2.2 判断 mxArray 数组类型
  在对 mxArray 类型的变量进行操作之前,可以验证以下其中的数组的数据类型,比如是否为double 数组、整数、字符串、逻辑值等,以及是否为某种结构、类、或者是特殊类型,比如是否为空数组,是否为 inf NaN 等。常见的判断函数有:

bool mxIsDouble(const mxArray *array_ptr);
bool mxIsComplex(const mxArray *array_ptr);
bool mxIsChar(const mxArray *array_ptr);
bool mxIsEmpty(const mxArray *array_ptr);
bool mxIsInf(double value);
…… ……

  这些函数比较简单,意义自明,不再解释。
   6.2.3 管理 mxArray 数组的数据
  对于常用的 double 类型的数组,可以用mxGetPr mxGetPi 两个函数分别获得其实部和虚部的数据指针,这两个函数的声明如下:

double *mxGetPr(const mxArray *array_ptr); // 返回数组 array_ptr 的实部指针
double *mxGetPi(const mxArray *array_ptr); //
返回数组 array_ptr 的虚部指针

这样,就可以通过获得的指针对 mxArray 类型的数组中的数据进行读写操作。例如可以用函数 engGetVariable Matlab 工作空间读入 mxArray 类型的数组,然后用 mxGetPr mxGetPi 获得数据指针,对并其中的数据进行处理,最后调用 engPutVariable 函数将修改后的数组重新写入到 Matlab 工作空间。

小结

本文详细的介绍了 Matlab 引擎使用方法并演示了一个简单的利用 VC 调用 Matlab 画图的程序实例。大多数时候,程序员可以利用 Matlab 强大的数据读写、显示能力和 VC 编程的高效率。例如,在 Matlab 中要读入一幅任意格式的图像均只需一条命令i=imread('test.jp'); 图像数据矩阵便存放在了二维数组 i 中,可以通过 VC 读入该数组进行相关处理再调用 Matlab 显示,这种混合编程方式能大大提高工作效率。

当然,利用 VC 编译的 Matlab 引擎程序,运行环境中还必须 Matlab 的支持,如果要编译完全脱离 Matlab 的程序,可采用其它方式,如利用第三方 Matcom 程序编译独立的可执行程序等。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有