VC++与Matlab混合编程方法*

2014-09-13 06:03张沛露王建军
吉林建筑大学学报 2014年6期
关键词:数组调用编程

张沛露 王建军

(1:吉林建筑大学计算机科学与工程学院,长春 130118; 2:中国科学院长春光学精密机械与物理研究所,长春 130033)

Matlab是矩阵实验室(Matrix Laboratory)的简称,它是美国Math Works公司推出的一套数值计算软件,以矩阵作为基本数据结构,可以实现数值分析、优化、统计、偏微分方程数值解、自动控制、信号处理、图像处理等若干个领域的计算和图形处理功能.Matlab以矩阵作为基本数据结构,非常适合大规模的数值计算,使用Matlab,可以较使用传统的编程语言(如C,C++和Fortran等)更快地解决技术计算问题.VC++作为可视化编程的典范,可以利用它进行各类软件的开发,从编制各种功能强大的软件界面到开发各种复杂的数学算法,均可找到它的身影[1].一般情况下,利用VC对数学算法进行设计往往费时费力,而Matlab在进行数学算法设计时具有独特的优势,因此,在VC中调用Matlab进行混合编程是一种简便高效的处理方式[2].

1 VC++调用Matlab方法概述

一般来说,VC++调用Matlab混合编程有以下几个途径:

(1) 通过Matlab Engine方式. Matlab Engine是Matlab提供的一组接口函数,Matlab Engine采用C/S(客户机/服务器)模式,Matlab充当后台服务器,而VC++程序充当前台客户机,通过Windows的动态控件与服务器进行通信,向Matlab Engine传递命令和数据,并从Matlab Engine接受数据信息.开发者可以在前台程序中调用这些接口函数,实现对Matlab Engine的控制.采用这种方法几乎能利用Matlab全部功能,但是,需要在机器上安装Matlab软件.

(2) 直接调用Matlab的C/C++数学函数库. Matlab中还提供可以供C/C++语言调用的C/C++数学函数库,其中包含了大量C/C++语言重写的Matlab数学函数,这些函数涉及广泛,主要包括:线性代数、计算方法、傅立叶变换、多项式计算、解微分方程等,并且函数库中提供了许多矩阵操作函数,在VC中可以直接使用这些函数,通过使用这些函数可以在VC中方便地实现矩阵运算功能.

2 VC++调用Matlab方法示例

2.1 调用Matlab Engine方式示例

在安装Matlab计算机上,通过调用Matlab API函数,实现VC++对Matlab各种数学运算功能的使用[3].以矩阵运算为例,常用的Matlab API矩阵运算函数(如表1所示).

表1 常用Matlab API矩阵运算函数

若要成功调用Matlab Engine,还需在VC++中对编译环境进行设置,如对头文件、库文件包含路径进行设置等.采用Matlab Engine方式进行调用,不仅可以进行基本数学运算,还可以使用Matlab强大的图形功能.但是,该种方式的缺陷是不能脱离Matlab的运行环境,即在计算机上必须安装有Matlab软件才能运行目标程序,给程序的移植带来不便.下面的例子给出了使用引擎方式调用Matlab的常用方式.

#include

#include

#include "engine.h"

using namespace std;

void main()

{

const int N = 50;

double x[N],y[N];

int j = 1;

for (int i=0; i

{

x[i] = (i+1);

y[i] = sin(x[i]) + j * log(x[i]); //产生-之间的随机数赋给xx[i];

j *= -1;

}

Engine *ep; //定义Matlab引擎指针.

ep=engOpen(NULL); //测试是否启动Matlab引擎成功.

//定义mxArray,为行,N列的实数数组.

mxArray *xx = mxCreateDoubleMatrix(1,N, mxREAL);

mxArray *yy = mxCreateDoubleMatrix(1,N, mxREAL); //同上.

memcpy(mxGetPr(xx), x, N*sizeof(double)); //将数组x复制到mxarray数组xx中.

memcpy(mxGetPr(yy), y, N*sizeof(double)); //将数组x复制到mxarray数组yy中.

engPutVariable(ep, "xx",xx); //将mxArray数组xx写入到Matlab工作空间,命名为xx.

engPutVariable(ep, "yy",yy); //将mxArray数组yy写入到Matlab工作空间,命名为yy.

//向Matlab引擎发送画图命令.plot为Matlab的画图函数,参见Matlab相关文档.

engEvalString(ep, "plot(xx, yy); ");

mxDestroyArray(xx); //销毁mxArray数组xx和yy.

mxDestroyArray(yy);

engClose(ep); //关闭Matlab引擎.

}

2.2 调用Matlab的C/C++函数库

在使用Matlab的C/C++函数库前需要进行安装[4]:

1) 在Matlab命令窗口输入:mbuild-setup;

2) 按照提示选择VC的编译器,完成后在Matlab命令窗口中输入:mex-setup.

由于Matlab C++ Math Library或Matlab C Math Library是以动态链接库的形式,提供对函数的调用,因此首先要在Visual C++的集成开发环境中进行编译环境的配置.主要包括:

1) 设置Matlab中头文件(*.h)和链接库(*.lib)的路径;

2) 设置运行时动态链接库;

3) 设置静态链接的引入库文件;

4) 在用到Matlab的源程序中加入#include“matlab.h”.

下面给出来看matlab自带的一个使用C函数库的例子.

#include

#include /* used for EXIT_SUCCESS */

#include

#include "matlab.h"/*matlab.h为C数学函数库的头文件

static double real_data[]= { 1, 2, 3, 4, 5, 6 };

static double cplx_data[]= { 7, 8, 9, 10, 11, 12 };

int main()

{

/* 声明两个mxArray矩阵变量并赋初值为NULL */

mxArray *mat0 = NULL;

mxArray *mat1 = NULL;

/* 使用自动内存管理*/

mlfEnterNewContext(0, 0);

/* 创建矩阵mat0,mat1并赋值 */

mlfAssign(&mat0, mlfDoubleMatrix(2, 3, real_data, NULL));

mlfAssign(&mat1, mlfDoubleMatrix(3, 2, real_data, cplx_data));

mlfPrintMatrix(mat0);

mlfPrintMatrix(mat1);

mxDestroyArray(mat0);

mxDestroyArray(mat1);

mlfRestorePreviousContext(0, 0);

return(EXIT_SUCCESS);

}

3 结语

本文阐述了VC调用Matlab的两种常用方法,对其中较为常用的方法进行了详细介绍,并给出示例说明,为相关人员进行混合编程提供较为实用的方法.两种方法都需要Matlab环境支持,安装Matlab会占用较多资源,在资源紧张时容易受到限制,下一步拟对Matlab安装环境依赖较小的方法进行研究.

参 考 文 献

[1] 朱传安,潘大夫.Matlab与C/C++混合编程接口及应用[J].微计算机信息,2010(15):237-239.

[2] [美]David J.KruglinsKi,Scot Wingo.Visual C++6.0技术内幕(第五版)[M].北京:北京希望电子出版社,2001:550-672.

[3] 吕延庆,朱坚民,周福章.基于Visual C++和Matlab的联合编程方法的研究[J].计算机应用研究,2000(11):101-103.

[4] 李天昀,葛临东.综述MATLAB与VC++的交互编程[J].计算机仿真,2004(9):193-196.

猜你喜欢
数组调用编程
JAVA稀疏矩阵算法
编程,是一种态度
元征X-431实测:奔驰发动机编程
编程小能手
JAVA玩转数学之二维数组排序
纺织机上诞生的编程
核电项目物项调用管理的应用研究
LabWindows/CVI下基于ActiveX技术的Excel调用
Excel数组公式在林业多条件求和中的应用
基于系统调用的恶意软件检测技术研究