您的位置:首页 > 编程语言 > MATLAB

用C/C++读取MATLAB中mat文件中的Cell数据

2015-11-03 22:12 666 查看

一、引言

最近由于研究需要,要用C语言调用MATLAB中的cell数据。于是,百度了一下,很容易找到了C++读写.mat文件

但发现该文中说的是如何用C/C++调用mat文件中的矩阵,而我要调用的是mat文件中的cell数据,于是,又开始在网上狂找资料。不过这次就没那么幸运了,最后终于找到了一根”救命稻草“——mxGetCell(),之后在C++读写.mat文件的基础上自己摸索了一下,顺利解决了问题!!详见第二节。

二、C/C++调用MATLAB中的cell数据

1、mxGetCell原型

/*
* Get a pointer to the specified cell element.
*/
EXTERN_C mxArray *mxGetCell(const mxArray *pa, mwIndex i);


参数说明:

输入:

pa:指向mxArray类型的指针;

i:元胞中元素的标号;按列优先,依次为0,1,2…..。

输出:

指向mxArray类型的指针。

2、实例详解

a、这里要读入的是以下形式的元胞数组:



b、其中元胞a的主要内容如下:





c、C代码详解:

#include "mat.h"
int main()
{

MATFile *pmat;//指向mat文件的指针
const char **dir;//元素名列表
const char *file;//要打开的mat文件名
int         ndir;//mat文件中的元素(矩阵、元胞)个数
mxArray *cell1;//指向要读取的元胞数据的指针
mxArray *mat1;//指向元胞中某个元素的指针
double *a;//指向元胞中某个元素第一个数据的指针
int cellM,cellN,M,N;
int count;
int i,j;

file="cellMat.mat";  //要打开的mat文件名
pmat = matOpen(file, "r");//打开文件,返回指向文件指针
if (pmat == NULL)
{
printf("打开mat文件失败!");
return 0;
}
//读取mat文件中的矩阵列表(返回mat中包含的元素的名字)
dir = (const char **)matGetDir(pmat, &ndir);
if (dir == NULL)
{
printf("读取mat文件失败!");
return 0;
}

//输出cellMat.mat中的元素数量
printf("%s文件中一共有%d个元素\n",file,ndir);

//从打开的mat文件中(pamt)读取名字为dir[0]的元胞
//(返回指向该矩阵的指针,注意:MATLAB中的矩阵是按列优先存储到)
cell1 = matGetVariable(pmat,dir[0]);//指向名字为dir[0]的元胞

cellM = (int)mxGetM(cell1);//获取元胞的行数
cellN = (int)mxGetN(cell1);//获取元胞的列数
//按列优先依次读取元胞中的数据
for(count=0;count<cellM*cellM;count++)
{
mat1 = mxGetCell(cell1,count);//按列优先,指向元胞中的第count+1个元素

a = (double*)mxGetData(mat1);//指向mat1中的第一个数据

M = (int)mxGetM(mat1);//获取mat1的行数
N = (int)mxGetN(mat1);//获取mat1的列数

printf("元素%d的维数为:(%d,%d)\n",count,M,N);

for (i=0;i<M;i++)
{
for (j=0;j<N;j++)
printf("%-5.4f ",a[j*M+i]);
printf("\n");
}
}
matClose(pmat);//关闭文件
return 0;
}


d、代码运行结果:



从运行结果来看和上述MATLAB中显示的数据是一致的。

三、进一步探讨

由于上述读取的mat文件中只包含一个元胞数组,过于简单,大家可以参考上述代码,尝试读一下包含多个cell的mat文件以及多个cell与矩阵混合的mat文件,以此来加深理解。

最后,再次感谢C++读写.mat文件的作者!

说明:

对于上述代码中表述不清或不准确的地方欢迎大家批评指正!!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: