1. 程式人生 > >C/C++ 中呼叫matlab 的兩種方式

C/C++ 中呼叫matlab 的兩種方式

matlab中在數值計算方面有很大優勢,如:矩陣計算 求解方程等。

在C/C++開發中,我們實現相同的功能往往很複雜,我們可以在C/C++開發環境下呼叫matlab進行混合程式設計。

下面主要介紹環境配置相關的說明。

注:

我的本地測試環境是 

VS2008 

WIN7 64位 

matlab 2011b 32位

1. 配置VS2008 

開啟VS "工具"  -> "選項" -> "VC++目錄"  按照下面兩個圖 新增標頭檔案和庫檔案。



注:這個配置只需要做一次就可以了。

2. matlab配置

在command window輸入:

mex -setup   

   很可能會報錯,提示缺少64 compiler。OK,需要在安裝VS時選一下64位編譯器。

安裝好了之後,重新執行上面那個命令,直至出現Done.即可。如圖:


接著執行mbuild -setup 結果如圖:


3. 配置Windows環境變數。

為Windows環境變數中的系統變數(S)加上下面這兩項:

D:\Program Files\MATLAB\R2011b\bin 【這一項安裝完matlab會預設加上】 和

D:\Program Files\MATLAB\R2011b\bin\win64【這個也可以是win32 看自己的環境】

如果不配置這個的話,編譯連結都沒問題,執行時會報錯的,提示找不到各種DLL,(心累////

接著,我們就可愉快地使用C呼叫matlab了。

一般有兩種方式:

呼叫matlab引擎 和  呼叫matlab函式生成的DLL。

第一種:呼叫matlab引擎

首先需要引標頭檔案  #include "engine.h"  這個檔案在 %MATLAB_PATH%\extern\include裡,我們在VC++目錄包含過了。

否則,就會提示 cannot find engine.h file之類的錯誤。

然後,我們需要引用幾個函式呼叫依賴庫(lib)  libeng.lib libmx.lib libmat.lib。

#pragma comment(lib, "libeng.lib")

#pragma comment(lib, "libmx.lib")

#pragma comment(lib, "libmat.lib")

否則連結時會報錯 無法解析的符號之類的錯誤。

之後我們就可以呼叫引擎了。

和檔案操作類似:開啟 操作 關閉。

開啟引擎:

Engine *ep;
if (!(ep = engOpen("\0")))
{
	fprintf(stderr, "\nCan't start MATLAB engine\n");
	return EXIT_FAILURE;
}
定義變數需要轉換為matlab的格式。比如使用:mxCreateDoubleMatrix 和 memcpy函式。

將資料傳入引擎使用:engPutVariable()。

接著呼叫  engEvalString(ep, "matlab指令")matlab的指令作為引數進行操作。

計算操作等完成後需要清理操作:

mxDestroyArray()函式清理mxCreateDoubleMatrix 生成的變數。

engClose()關閉引擎。

下面給出一個繪圖的例子:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "engine.h"		// add header file

// import necessary lib
#pragma comment( lib, "libeng.lib")
#pragma comment( lib, "libmx.lib")
#pragma comment( lib, "libmat.lib")

int main(void)
{
	Engine *ep;

	// open engine
	if (!(ep = engOpen("\0")))
	{
		fprintf(stderr, "\nCan't start MATLAB engine\n");
		return EXIT_FAILURE;
	}

	// generate variables
	int Nsample = 50;
	const double PI = 3.1415926;
	double *t = new double[Nsample] ;

	for(int i = 0; i < Nsample; i++)
	{
		t[i] = i * 2 * PI / Nsample;
	}

	mxArray *T = NULL, *result = NULL;
	T = mxCreateDoubleMatrix(1, Nsample, mxREAL);
	memcpy((void *)mxGetPr(T), (void *)t, Nsample*sizeof(t[0]));

	engPutVariable(ep, "T", T);			// put data to engine

	// execute matlab operations
	engEvalString(ep, "Y=sin(T);");
	engEvalString(ep, "plot(T,Y);");
	engEvalString(ep, "title('y=sin(t)');");
	engEvalString(ep, "xlabel('t');");
	engEvalString(ep, "ylabel('y');");

	printf("Hit return to continue\n");
	fgetc(stdin);

	// clean operation(don't forget!!!)
	mxDestroyArray(T);
	engEvalString(ep, "close;");

	// close engine
	engClose(ep);

	return EXIT_SUCCESS;
}
執行結果如圖:

【第一次執行程式會比較慢。】

第二種:呼叫matlab函式匯出的DLL

參考:

http://blog.163.com/rongting_chen/blog/static/164906844201252354518462/

在此感謝。