ITPub博客

首页 > Linux操作系统 > Linux操作系统 > matlab 数据文件MAT的读与写

matlab 数据文件MAT的读与写

原创 Linux操作系统 作者:lizecn 时间:2010-05-11 17:44:43 0 删除 编辑

相信matlab的流行, 可以从盗版的速度以及盗版的覆盖率看出, 各大学校物理化学自动化实验室说没有matlab来辅助计算和模拟, 还真不能想象这个实验室规模.

matlab 提供了额外的库供大家存取他的数据文件mat, 该数据文件是二进制的, 有特殊的头和数据格式.

以下函数设计仅仅示范, 大家可以自创

unsigned int matrixLoadFromMat(float* A,char* Matfile,char* matrixName);
unsigned int matrixSaveToMat(float* A, char* matFile,char* matrixName,int m, int n);

两个函数返回值都是存或者取的数据总个数, 运行期间需要安装matlab, 并在系统path目录有matlab的dll 所在目录C:\Program Files\MATLAB\R2010a\bin\win64(这个是64位matlab安装目录) m 和 n 是矩阵的行列数, 注意一下矩阵存储在matlab下面是按照列来存储的.

头文件

#include


unsigned int matrixLoadFromMat(float* A,char* matFile,char* matrixName)
{
     MATFile *pMatFile=NULL;
     mxArray *pMxArray=NULL;
     float* pFloat=NULL;
     unsigned int numberOfElements=0;
 
     pMatFile = matOpen(matFile, "r");
     if (pMatFile == NULL) {
        printf("Error reopening file %s\n", matFile);
        return 0;
     }
     pMxArray = matGetVariable(pMatFile, matrixName);
     if (pMxArray == NULL) {
         printf("Error reading existing matrix from the %s file\n",matFile);
        return 0;
     }
  
    pFloat=(float*)mxGetData(pMxArray);
    numberOfElements=mxGetNumberOfElements(pMxArray);
    for (unsigned int i=0;i    {
         A[i]=pFloat[i];
     }

    if (matClose(pMatFile) != 0) {
         printf("Error closing file %s\n",matFile);
         return 0;
     }

     mxDestroyArray(pMxArray);
     return numberOfElements;

}

unsigned int matrixSaveToMat(float* A, char* matFile,char* matrixName,int m, int n)
{
    MATFile *pMatFile=NULL;
    mxArray *pMxArray=NULL;
    double* pDouble=NULL;
    int status;
    unsigned int numberOfElements=0;
    int i=0;
    int j=0;

    pMatFile = matOpen(matFile, "w");
    pMxArray = mxCreateDoubleMatrix(m,n,mxREAL);
    pDouble=(double*)malloc(m*n*sizeof(double));
    for (int i=0;i    {
         pDouble[i]=A[i];  //转换成double, matlab默认数据格式double
     }
    if (pMxArray == NULL) {
       printf("Unable to create mxArray.\n");
       return 0;
    }
  memcpy((void*)(mxGetPr(pMxArray)), (void*)pDouble,m*n*mxGetElementSize (pMxArray));
   status = matPutVariable(pMatFile, matrixName, pMxArray);
    if (status != 0) {
       printf("%s :  Error using matPutVariable on line %d\n", __FILE__, __LINE__);
       return 0;
    }
    mxDestroyArray(pMxArray);
    free(pDouble);
    if (matClose(pMatFile) != 0) {
        printf("Error closing file %s\n",matFile);
        return 0;
    }
 
    numberOfElements=mxGetNumberOfElements(pMxArray);
    return numberOfElements;

}

 

代码相当简单, 基本上就是用指针来获取数据,相信大家都能看得懂, 有不懂的, 再来询问.

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/20259129/viewspace-662454/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2010-01-14

  • 博文量
    6
  • 访问量
    23984