matlab 資料檔案MAT的讀與寫

lizecn發表於2010-05-11

相信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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章