張沛露 王建軍
(1:吉林建筑大學計算機科學與工程學院,長春 130118; 2:中國科學院長春光學精密機械與物理研究所,長春 130033)
Matlab是矩陣實驗室(Matrix Laboratory)的簡稱,它是美國Math Works公司推出的一套數(shù)值計算軟件,以矩陣作為基本數(shù)據(jù)結構,可以實現(xiàn)數(shù)值分析、優(yōu)化、統(tǒng)計、偏微分方程數(shù)值解、自動控制、信號處理、圖像處理等若干個領域的計算和圖形處理功能.Matlab以矩陣作為基本數(shù)據(jù)結構,非常適合大規(guī)模的數(shù)值計算,使用Matlab,可以較使用傳統(tǒng)的編程語言(如C,C++和Fortran等)更快地解決技術計算問題.VC++作為可視化編程的典范,可以利用它進行各類軟件的開發(fā),從編制各種功能強大的軟件界面到開發(fā)各種復雜的數(shù)學算法,均可找到它的身影[1].一般情況下,利用VC對數(shù)學算法進行設計往往費時費力,而Matlab在進行數(shù)學算法設計時具有獨特的優(yōu)勢,因此,在VC中調用Matlab進行混合編程是一種簡便高效的處理方式[2].
一般來說,VC++調用Matlab混合編程有以下幾個途徑:
(1) 通過Matlab Engine方式. Matlab Engine是Matlab提供的一組接口函數(shù),Matlab Engine采用C/S(客戶機/服務器)模式,Matlab充當后臺服務器,而VC++程序充當前臺客戶機,通過Windows的動態(tài)控件與服務器進行通信,向Matlab Engine傳遞命令和數(shù)據(jù),并從Matlab Engine接受數(shù)據(jù)信息.開發(fā)者可以在前臺程序中調用這些接口函數(shù),實現(xiàn)對Matlab Engine的控制.采用這種方法幾乎能利用Matlab全部功能,但是,需要在機器上安裝Matlab軟件.
(2) 直接調用Matlab的C/C++數(shù)學函數(shù)庫. Matlab中還提供可以供C/C++語言調用的C/C++數(shù)學函數(shù)庫,其中包含了大量C/C++語言重寫的Matlab數(shù)學函數(shù),這些函數(shù)涉及廣泛,主要包括:線性代數(shù)、計算方法、傅立葉變換、多項式計算、解微分方程等,并且函數(shù)庫中提供了許多矩陣操作函數(shù),在VC中可以直接使用這些函數(shù),通過使用這些函數(shù)可以在VC中方便地實現(xiàn)矩陣運算功能.
在安裝Matlab計算機上,通過調用Matlab API函數(shù),實現(xiàn)VC++對Matlab各種數(shù)學運算功能的使用[3].以矩陣運算為例,常用的Matlab API矩陣運算函數(shù)(如表1所示).
表1 常用Matlab API矩陣運算函數(shù)
若要成功調用Matlab Engine,還需在VC++中對編譯環(huán)境進行設置,如對頭文件、庫文件包含路徑進行設置等.采用Matlab Engine方式進行調用,不僅可以進行基本數(shù)學運算,還可以使用Matlab強大的圖形功能.但是,該種方式的缺陷是不能脫離Matlab的運行環(huán)境,即在計算機上必須安裝有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]); //產(chǎn)生-之間的隨機數(shù)賦給xx[i]; j *= -1; } Engine *ep; //定義Matlab引擎指針. ep=engOpen(NULL); //測試是否啟動Matlab引擎成功. //定義mxArray,為行,N列的實數(shù)數(shù)組. mxArray *xx = mxCreateDoubleMatrix(1,N, mxREAL); mxArray *yy = mxCreateDoubleMatrix(1,N, mxREAL); //同上. memcpy(mxGetPr(xx), x, N*sizeof(double)); //將數(shù)組x復制到mxarray數(shù)組xx中. memcpy(mxGetPr(yy), y, N*sizeof(double)); //將數(shù)組x復制到mxarray數(shù)組yy中. engPutVariable(ep, "xx",xx); //將mxArray數(shù)組xx寫入到Matlab工作空間,命名為xx. engPutVariable(ep, "yy",yy); //將mxArray數(shù)組yy寫入到Matlab工作空間,命名為yy. //向Matlab引擎發(fā)送畫圖命令.plot為Matlab的畫圖函數(shù),參見Matlab相關文檔. engEvalString(ep, "plot(xx, yy); "); mxDestroyArray(xx); //銷毀mxArray數(shù)組xx和yy. mxDestroyArray(yy); engClose(ep); //關閉Matlab引擎. } 在使用Matlab的C/C++函數(shù)庫前需要進行安裝[4]: 1) 在Matlab命令窗口輸入:mbuild-setup; 2) 按照提示選擇VC的編譯器,完成后在Matlab命令窗口中輸入:mex-setup. 由于Matlab C++ Math Library或Matlab C Math Library是以動態(tài)鏈接庫的形式,提供對函數(shù)的調用,因此首先要在Visual C++的集成開發(fā)環(huán)境中進行編譯環(huán)境的配置.主要包括: 1) 設置Matlab中頭文件(*.h)和鏈接庫(*.lib)的路徑; 2) 設置運行時動態(tài)鏈接庫; 3) 設置靜態(tài)鏈接的引入庫文件; 4) 在用到Matlab的源程序中加入#include“matlab.h”. 下面給出來看matlab自帶的一個使用C函數(shù)庫的例子. #include #include #include #include "matlab.h"/*matlab.h為C數(shù)學函數(shù)庫的頭文件 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); /* 創(chuàng)建矩陣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); } 本文闡述了VC調用Matlab的兩種常用方法,對其中較為常用的方法進行了詳細介紹,并給出示例說明,為相關人員進行混合編程提供較為實用的方法.兩種方法都需要Matlab環(huán)境支持,安裝Matlab會占用較多資源,在資源緊張時容易受到限制,下一步擬對Matlab安裝環(huán)境依賴較小的方法進行研究. 參 考 文 獻 [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的聯(lián)合編程方法的研究[J].計算機應用研究,2000(11):101-103. [4] 李天昀,葛臨東.綜述MATLAB與VC++的交互編程[J].計算機仿真,2004(9):193-196.2.2 調用Matlab的C/C++函數(shù)庫
3 結語