5. 程序實例
對大部分軟件研發人員來說利用VC編程方便、高效,但是要顯示數據圖形就不那么容易了,這時候不防借助Matlab引擎輔助畫圖做數據分析。下面通過實例演示如何利用VC調用Matlab繪圖,程序的主要功能是在VC中對數組x計算函數值y=sin(x) ±log(x),然后調用Matlab繪制y對x的圖形。
在VC中新建工程,編寫代碼如下:
#include <iostream>
#include <math.h>
#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<N; i++) //計算數組x和y
{
x[i] = (i+1);
y[i] = sin(x[i]) + j * log(x[i]); //產生-之間的隨機數賦給xx[i];
j *= -1;
}
Engine *ep; //定義Matlab引擎指針。
if (!(ep=engOpen(NULL))) //測試是否啟動Matlab引擎成功。
{
cout <<"Can't start Matlab engine!" <<endl;
exit(1);
}
//定義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);
cout <<"Press any key to exit!" <<endl;
cin.get();
engClose(ep); //關閉Matlab引擎。
}
編譯並運行程序得結果入下圖:
本文詳細的介紹了Matlab引擎使用方法並演示了一個簡單的利用VC調用Matlab畫圖的程序實例。大多數時候,程序員可以利用Matlab強大的數據讀寫、顯示能力和VC編程的高效率。例如,在Matlab中要讀入一幅任意格式的圖像均只需一條命令i=imread('test.jp');圖像數據矩陣便存放在了二維數組i中,可以通過VC讀入該數組進行相關處理再調用Matlab顯示,這種混合編程方式能大大提高工作效率。
當然,利用VC編譯的Matlab引擎程序,運行環境中還必須Matlab的支持,如果要編譯完全脫離Matlab的程序,可采用其它方式,如利用第三方Matcom程序編譯獨立的可執行程序等。
