用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文件的作者!
说明:
对于上述代码中表述不清或不准确的地方欢迎大家批评指正!!
相关文章推荐
- Matlab2014a(64-bit)安装libsvm3.12
- matlab中double、im2double、mat2gray区别
- matlab问题
- 2.描述性统计的matlab 实现
- matlab练习程序(奇异值分解压缩图像)
- 加速matlab运行的三重境界
- matlab 位操作
- matlab读取视频VideoReader类
- 项目代码matlab
- matlab double axes, 两个坐标轴 papa的儿子,儿子的papa
- Matlab 三维图像绘制(1)——纹理贴图、球体
- libsvm在matlab和Python上的探索
- MATLAB实现坐标系变换动画演示
- 新版Matlab中函数aviread报错问题
- c# 调用 matlab
- 在win7下如何以兼容模式运行matlab
- 遗传算法的matlab实现
- MATLAB函数汇总
- 关于Matlab中avi视频的读取问题
- RCNN 安装编译与MATLAB2014下问题解决