1. 程式人生 > >C語言呼叫MATLAB程式之簡單樣例

C語言呼叫MATLAB程式之簡單樣例

    首先宣告一下,本文中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函式執行即可。