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

一、引言

最近由于研究需要,要用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文件的作者!

说明:

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

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值