请教各位高手,用C/C++怎么读取mat文件中的结构体。比如:在matlab中定义了一个str结构体:str.level = 1, str.image = 1. str(2).image = 5, str(2).level = 3.然后把它存为mat文件我想在C++中读取它,并打印出来。请问代码怎么写。谢谢了

解决方案 »

  1.   

    这个很好读得,下面是我以前在网上抄的:
    1. 头文件中写入
    #include "mat.h"

    #pragma comment(lib, "libmat.lib")
    #pragma comment(lib,"libmx.lib")
    上面这三个文件在MATLAB安装目录下的extern\include和extern\lib目录下。一般来说安装MATLAB后这两个路径会被自动添 加到VC的设置中。如果没有,可以在VC的Tools->Options->Directories下手工添加。
     
    2. 在MATLAB中定义两个变量
    z=999
    mat1=[1,2,3,4;
          5,6,7,8;
          9,10,11,12]
    并把其保存成一个MAT文件,使用命令:
    save matfile1 z mat1
    就生成了一个matfile1.mat文件
     
    3. 先把程序写下来
    void CMy5Doc::OnOptmatOpen()
    {
     // TODO: Add your command handler code here
     CFileDialog dlgFileOpen(TRUE);
     MATFile *pmatFile=NULL;
     mxArray *pMxArray=NULL; TCHAR lpstrFilename[MAX_PATH]="";
     dlgFileOpen.m_ofn.lpstrFile = lpstrFilename;
     TCHAR fileFilter[]="MAT文件\0*.MAT\0所有的文件\0*.*\0";
     dlgFileOpen.m_ofn.lpstrFilter = fileFilter;
     CString msg;
     double *dMat1 = new double;
     int m,n;
     double *dMat2;
     if(dlgFileOpen.DoModal()==IDOK)
     { 
      pmatFile = matOpen(dlgFileOpen.GetFileName(),"r");//A
      pMxArray = matGetVariable(pmatFile,"z");//B
      dMat1 = (double *)mxGetData(pMxArray);//C
      msg.Format("%f",*dMat1);
      AfxMessageBox(msg);
      pMxArray = matGetVariable(pmatFile,"mat1");
      m = mxGetM(pMxArray);
      n = mxGetN(pMxArray);//D
      msg.Format("M:%d,N:%d",m,n);
      AfxMessageBox(msg);
      dMat2 = new double[m*n];
      dMat2 = (double *)mxGetData(pMxArray);
      CString strTmp;
      msg = "";
      for(int i=0;i<m;i++)
      {
       for(int j=0;j<n;j++)
       {
        strTmp.Format("%f",dMat2[j*m+i]);//E
        msg = msg + strTmp + "   ";
       }
       msg = msg + "\n";
      }
      AfxMessageBox(msg);
      matClose(pmatFile);
      mxFree(pMxArray);
      mxFree(pmatFile);//F
     } 
    }
     
    4. 下面是程序的说明
     
    A:打开一个MAT文件使用函数matOpen(),其定义为:
    MATFile *matOpen(const char *filename,const char *mode)
    其中mode可以是以下几个:
    r:以只读方式打开
    u:更新模式,可读可写,但是如果要打开的数据文件不存在,也不会创建新的文件
    w:以写入方式打开,只能写如入,如果要打开的数据文件不存在,则创建一个新的文件
     
    B:获得一个MAT文件中的变量,函数matGetVariable()定义为:
    mxArray *matGetVariable(MATFile *pMF,const char *name)
    由于在MATLAB中所有的变量均看做矩阵,因此返回一个mxArray的指针类型。
     
    C:mxGetData()用于得到矩阵中的具体值,定义为:
    void *mxGetData(const mxArray *)
    由于返回是void*类型,所以必须强制类型转换为所需要的数据类型。
     
    D:pMxArray = matGetVariable(pmatFile,"mat1");
       m = mxGetM(pMxArray); 
       n = mxGetN(pMxArray);
    2,3句用于得到MAT文件中mat1矩阵的行和列,即mat1是一个m×n的矩阵,定义为:
    int mxGetM(const mxArray*)
     
    E:由于MATLAB中矩阵是按列存放的,而不是C语言中的按行存放,即存储方式为a[0][0],a[1][0]……a[N][0],a[0] [1],a[1][1]……a[N][1],所以在按行显示矩阵的时候必须使用dMat2[j*m+i]而不是dMat2[i*m+j]。
     
    F:在对文件操作完后,记得要关闭文件,释放资源。使用matClose()可以关闭文件。
      

  2.   

    貌似2楼
      mxFree(pMxArray);
      mxFree(pmatFile);
    这两句执行有问题,我是VS2010环境下。
      

  3.   

      matClose(pmatFile);
      mxFree(pMxArray);
      mxFree(pmatFile);
    修改成:
      matClose(pmatFile);
      mxDestroyArray(pMxArray);
      

  4.   

    还有
      dMat2 = new double[m*n];
      dMat2 = (double *)mxGetData(pMxArray);
    这两句话有问题。
    第一句话执行完后DMat2 指向 new分配的对象
    第二句话后DMat2指向mxGetData指向的对象
    所以2楼的代码在内存安全上很不严密,可能存在内存泄露问题。