c++与matlab混合编译———读取mxArray内容

版权声明:转载请注明出处(作者:Ephemeroptera) https://blog.csdn.net/Ephemeroptera/article/details/84064378

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

}

所得到的结果如下:

猜你喜欢

转载自blog.csdn.net/Ephemeroptera/article/details/84064378