C語言呼叫MATLAB程式之簡單樣例
阿新 • • 發佈:2019-02-13
首先宣告一下,本文中C語言呼叫MATLAB語言的方法,本質上是通過C語言程式設計實現利用MATLAB引擎執行MATLAB程式碼,並最終獲得執行結果。如何用C語言建立MATLAB引擎的引用,MATLAB已經為我們準備好了一系列的標頭檔案以及動態連結庫檔案,所以我們只要配置好相關環境即可(如何配置環境可以參考我上一篇部落格)。從另一方面講,這也就意味著程式執行時需要完整的MATLAB軟體的支援,當然還有一種呼叫方案是將“.m檔案”編譯成dll,但程式執行時仍需要MCR的支援。
因為我們要呼叫MATLAB程式,所以我們要先編寫MATLAB程式碼。我將MATLAB程式碼檔案儲存在預設位置(也就是我們儲存時軟體給出的位置,我的軟體版本是R2014b)上,在我的電腦上的路徑是“文件\MATLAB”。這樣做的好處是我們不需要做額外的設定,這些程式碼就能在我們呼叫它們時執行,如果你儲存到其他位置,那麼就要呼叫一個函式來設定工作空間,這個函式你可以在下面的參考博文[1]中找到。
在準備好MATLAB程式後,我們就開始建立C語言工程,我這裡使用的整合開發環境是VS2015(建議選擇VS系列,其他開發環境不一定能進行相關引用的配置)。建好工程後,我們就要配置好工程的環境,這個可以參考我上一篇博文。配置好工程環境後,我們就可以編寫程式碼,這裡我給出一個簡單的示例程式碼,大家看過之後就會明白使用方法。
#include <stdio.h>
#include <math.h>
#include "engine.h" //新增MATLAB引擎標頭檔案
#include <string.h>
int main()
{
double m[][3] = { {1, 2, -4}, {-2, 2, 1}, {-3, 4, -2} };
Engine *ep;
mxArray *matrix, *r_matrix, *value;
if (!(ep = engOpen(NULL)))
{
fprintf(stderr, "\n無法啟動MATLAB引擎\n" );
return EXIT_FAILURE;
}
matrix = mxCreateDoubleMatrix(3, 3, mxREAL);
memcpy(mxGetPr(matrix), m, sizeof(double)*3*3);
engPutVariable(ep, "matrix", matrix);
//determinant_value是我的MATLAB檔名同時也是檔案裡的函式名,下同
engEvalString(ep, "value = determinant_value(matrix)");
value = engGetVariable(ep, "value" );
printf("value = %f\n", *mxGetPr(value));
engEvalString(ep, "r_matrix = inverse_matrix(matrix)");
r_matrix = engGetVariable(ep, "r_matrix"); //r_matrix代表C裡的二維陣列
for (int i = 0; i < 3; ++i)
{
for (int j = 0; j < 3; ++j)
{
printf("%f ", mxGetPr(r_matrix)[i*3+j]);
}
printf("\n");
}
mxDestroyArray(matrix);
engClose(ep);
system("pause");
return 0;
}
從上面的使用方式我們可以看出, 如果只是直接使用MATLAB自帶的函式,則不必單獨去寫一個MATLAB程式碼,直接利用engEvalString函式執行即可。