matlab 数据文件MAT的读与写

相信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博客 ” ,链接:http://blog.itpub.net/20259129/viewspace-662454/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/20259129/viewspace-662454/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值