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",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