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函數執行即可。


參考:
[1] C語言環境中調用Matlab程序指南
[2] C 語言調用Matlab程序例子

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章