MAT文件示例

MAT文件可由MATLAB命令save直接生成,也在MEX文件或engine应用程序中,由用户C程序生成。本节以MEX应用程序“MAT1.c”为例,说明MAT文件的创建、打开与数据输入输出。该程序可三部分:

(1)头文件:主要是使用#include 指令将mat.h和mex.h文件包含于“MAT1.c”文件中;

(2)用户C程序:主要完成mxArray数据对象的赋值和写入mat文件操作;

(3)MEX接口程序:用户C程序与MATLAB间数据交换,即将MATLAB中文件外送入MEX文件中。

“MAT1.c”程序清单如下:

code.c
///////////////// Head /////////////////////////////////////////
#include "mex.h"
#include "mat.h"
/////////////////// C Program //////////////////////////////////////////
void OutPut(MATFile *fp)
{  mxArray *m_str,*m_P;  int i,j;
   double rx[]={1,2,3,4,5,6};    double ix[]={6,5,4,3,2,1};
   double ry[]={1,1,1,1,1,1};    double iy[]={6,6,6,6,6,6};
   m_P=mxCreateDoubleMATrix(2,6,mxCOMPLEX);///// 创建mxArray对象
   for(i=0;i<1;i++)for(j=0;j<6;j++)
   {*(mxGetPr(m_P)+j*2+i)=rx[j];*(mxGetPi(m_P)+j*2+i)=ix[j];}
   for(i=1;i<2;i++)for(j=0;j<6;j++)
   {*(mxGetPr(m_P)+j*2+i)=ry[j];*(mxGetPi(m_P)+j*2+i)=iy[j];}
   matPutVariable(fp,"m_P&quot;,m_P);  /////将mxArray对象写入mat
   m_str=mxCreateString(" mat File"); //// 创建mxArray对象
   matPutVariable(fp,"m_str";,m_str); /////将mxArray对象写入mat
   mxDestroyArray(m_str);mxDestroyArray(m_P); //释放内存
}
////////////////// mexFunction /////////////////////////////////////
void mexFunction(int nlhs,mxArray *plhs[],int nrhs, mxArray *prhs[])
{   MATFile *fp; int buf;
	mxChar *FileName;
////////////////// Get data from prhs[]
if(nrhs!=1||mxGetClassID(prhs[0])!=mxCHAR_CLASS)
	mexErrMsgTxt("Please Input a string to be the MATFile name\n");
buf=(mxGetM(prhs[0])*mxGetN(prhs[0]))+1;
FileName=mxCalloc(buf,sizeof(char));
mxGetString(prhs[0],FileName,buf);
//////////////////////////////////打开mat文件
if((fp=matOpen(FileName,"w"))==NULL)mexErrMsgTxt("Cant't Open MATFile");
OutPut(fp);  ///调用C程序,并将数据写入mat文件
mexPrintf("\n The '%s.mat' mat_File is created successfully!\n",FileName);
mxFree(FileName); //////释放内存
matClose(fp); //////关闭mat文件
}
///////////////////结束////////////////////////////////////////////////////

从“mat1.c”程序清单中可知,mat文件数据输入输出主要是mxArray类型数据的操作。因此,向mat文件中输入输出数据,主要是以mat库函数对mxArray数据对象的创建、赋值、读取、传递与写入等操作。在MATLAB命令窗口中将“MAT1.c”编译为MEX动态链接子程序,其调用与加载过程如下:

code.matlab
>> mex mat1.c
>> mat1('aaa')
   The 'aaa.mat' mat_File is created successfully!
>> load aaa -mat
>> whos
  Name        Size                    Bytes  Class
  m_P         2x6                       192  double array(complex)
  m_str       1x9                        18  char array
Grand total is 21 elements using 210 bytes
>> m_P
m_P =
1.0000 + 6.0000i   2.0000 + 5.0000i   3.0000 + 4.0000i   4.0000 + 3.0000i   5.0000 + 2.0000i   6.0000 + 1.0000i
1.0000 + 6.0000i   1.0000 + 6.0000i   1.0000 + 6.0000i   1.0000 + 6.0000i   1.0000 + 6.0000i   1.0000 + 6.0000i
>> m_str
m_str =
mat File