一、引言
最近由于研究需要,要用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;
}