1. 程式人生 > >c++與matlab混合編譯———讀取mxArray內容

c++與matlab混合編譯———讀取mxArray內容

            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);

}

所得到的結果如下: