c++與matlab混合編譯———讀取mxArray內容
阿新 • • 發佈:2018-11-14
mxArray作為一種特殊且複雜的資料結構,需要通過matrix.h提供的相關介面去訪問。在混合編譯過程中,matlab變數以mxArray形式儲存,通常用mxArray* 型別來指定matlab工作空間變數的地址進而訪問。然而因為該結構的特殊性,不能無法用直接的解引用進行訪值,通常需要用mxGetPr()獲取實部指標,配合mxGetNumberOfDimensions(獲取維數)、mxGetDimensions(獲取各維數大小)或者mxGetNumberOfElements(元素個數)來遍歷訪問它的元素。下面我將實現matlab空間中標量、二維矩陣、高維矩陣內容的讀取;
程式碼如下:
#include "pch.h" #include <iostream> #include "engine.h" #include <string.h> using namespace std; int main() { //開啟引擎 Engine *ep = NULL; //申明引擎指標 if (!(ep = engOpen(""))) { //指向matlab工作空間 fprintf(stderr, "\nCan't start MATLAB engine\n"); return EXIT_FAILURE; } /*--------------------------------------標量驗證--------------------------------------------------*/ cout << " (1)標量驗證\n" << endl; mxArray *X, *Y, *Zaddress; //matlab變數的指標 X = mxCreateDoubleScalar(3); Y = mxCreateDoubleScalar(4); engPutVariable(ep, "X", X); //變數X送入引擎,別名也是‘X’ engPutVariable(ep, "Y", Y); //變數Y送入引擎,別名也是‘Y’ engEvalString(ep, "Z=X*Y"); //在matlab引擎中執行操作 Zaddress = engGetVariable(ep, "Z"); //獲取matlab變數Z的地址 std::cout << "adress of Z is:" << Zaddress << std::endl; auto value = *(mxGetPr(Zaddress)); //獲取Zaddress實部指標並解引用 std::cout << "value of Z is:" << value << "\n\n" << std::endl; mxDestroyArray(X); //類似於matlab::clear mxDestroyArray(Y); mxDestroyArray(Zaddress); /*---------------------------------------2D矩陣驗證--------------------------------------------------*/ // a=magic(3)=[8 1 6; // 3 5 7; // 4 9 2;] cout << " (2)2D矩陣驗證\n" << endl; engEvalString(ep, "a=magic(3)"); //在matlab引擎中執行matlab命令 mxArray *A = engGetVariable(ep, "a"); //matlab變數的指標 size_t M = mxGetM(A); //M為矩陣行數 (size_t == unsigned int64) size_t N = mxGetN(A); //N為矩陣列數 int aNOE = mxGetNumberOfElements(A); //統計矩陣元素個數 cout << "矩陣a的行列值分別是: " << M << "和" << N << endl; cout << "矩陣a的元素個數是: " << aNOE << endl; int i = 1; double* p = mxGetPr(A); //實部指標 while (p != NULL && i <= aNOE) //列印各個元素 { cout << "第" << i << "個是:" << *p++ << endl; i++; } mxDestroyArray(A); //clear /*---------------------------------------高維矩陣驗證--------------------------------------------------*/ // 測試矩陣為b=rand(4,4,4,2); // cout << "\n (2)高維矩陣驗證\n" << endl; engEvalString(ep, "b=rand(4,4,4,2)"); //在matlab引擎中執行matlab命令 mxArray *B = engGetVariable(ep, "b"); //matlab變數的指標 mwSize bNOD = mxGetNumberOfDimensions(B); //矩陣的維數 const mwSize *D = mxGetDimensions(B); //D指向各維數指標 int bNOE = mxGetNumberOfElements(B); //統計矩陣元素個數 cout << "矩陣b的維數是:" << bNOD << endl; int j = 1; cout << "各維大小分別為:"; while (j <= bNOD) //列印各個維數 { cout << *D++ << " "; ++j; } cout << "\n矩陣b的元素個數是: " << bNOE << endl; mxDestroyArray(B); //clear /* 關閉引擎*/ engClose(ep); }
所得到的結果如下: