《MFC中读取.mat文件中任意位置的数据》

由于项目中用到了这个知识点:在MFC中读取.mat文件中矩阵变量的任意位置的数据,今天折腾了一下,觉得还是挺有意思的。因此就写了这篇博客。

在C++与Matlab混合编程中,经常会遇到将Matlab中返回的mxArray* 类型指针指向的数据读取出来。例如,matlab函数所返回的是一个如下的矩阵数据并保存在一个.mat文件中,但是在C++中应该如何读取出来呢??

《MFC中读取.mat文件中任意位置的数据》_第1张图片

在MFC中可以用如下代码读取.mat文件中的“output_rule”变量

MATFile * pmatFile = matOpen(PublicData::attribute+_T("\\OUTPUT\\OUTPUT.mat"),"r");  //第一个参数为.mat文件的地址 

    mxArray *   output_rule = matGetVariable(pmatFile, "output_rule"); 

当我们用如上的两行代码后,就得到了一个指向矩阵数据类型的mxArray *指针,当用了此指针后,又该如何的获取该矩阵类型的任意位置的数据呢??

代码如下:

                int row=mxGetM(output_rule);//矩阵的行数
                int col=mxGetN(output_rule);//列数
                double *oneAttribute_rule; 
                int val;
                oneAttribute_rule = (double*) mxGetData(output_rule); //oneAttribute_rule则为指向矩阵元素的指针,以此地址为首地址按列元素存储的矩阵数据。
                val=*oneAttribute_rule;//即为矩阵第一行第一列的元素
                oneAttribute_rule ++;//指针加1
                val=*oneAttribute_rule;//即为矩阵第一行第一列的元素。

如果想获取矩阵中第i行第j列元素的值;即获取如下oneAttribute_rule为首地址向后偏移(row*j+i)的值。

                //output_rule为指向矩阵的mxArray*变量。
                int row=mxGetM(output_rule);//矩阵的行数
                int col=mxGetN(output_rule);//列数
                double *oneAttribute_rule; 
                int val;
                oneAttribute_rule = (double*) mxGetData(output_rule); 
                for(int k=0;k<(row*j+i);k++){
                oneAttribute_rule++;
                }
                val=*oneAttribute_rule;//这就是我们矩阵中第i行第j列中的元素值。

这样就将如何在MFC中读取.mat文件中的矩阵的任意位置的元素数据。

但有时,我们的.mat文件中不是存储的矩阵,而是存储的是cell类型的变量。如下

这种情况下应该如下读取呢?

//out1为指向.mat文件中类似上图中所示的某个数据类型的mxArray*变量。
mxArray *p1;
mxArray *p2;
p1=mxGetCell(out1,xi);//读取out1中第xi个单元的数据
p2=mxGetCell(p1,1);//获取p1中第一个(从零开始)单元的数据,返回的是指针。
//直到p2指向的是某个矩阵数据,然后根据前面介绍的读取任意位置的数据即可。

如果time是一个指向一个元素的mxArray *类型,则用如下代码即可读出内容。

double a=mxGetScalar(time);

你可能感兴趣的:(matlab,mfc,读取,mat,cell)