版权声明:转载请注明出处(作者: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);
}
所得到的结果如下: