VC讀取mat格式文件

1.      首先設置Visual C++6.0 編譯環境的設置

1-1通過菜單 Tools/ Options,打開Visual C++6.0設置屬性頁,進入 Directorie頁面,在 Show Directories for下拉列表中選擇Include Files,添加路徑:…PROGRAM FILESMATLABR2007AEXTERNINCLUDE(在Matlab的安裝路徑下),再選擇下拉列表中的 Library Files,添加路徑:…PROGRAM FILESMATLABR2007AEXTERNLIBWIN32 MICROSOFTmsvc60 (在Matlab的安裝路徑下)。編譯環境只需設置一次.

 [轉載]C++讀取mat數據(1)

[轉載]C++讀取mat數據(1)

[轉載]C++讀取mat數據(1)

1-2 添加庫文件: 通過菜單 Projects|settings,進入 Link 頁面,在 Object/Library Modules 框中,添加庫文件名:lIBMx.lib libmat.lib libeng.lib。每個新的工程文件都要單獨添加庫文件。

[轉載]C++讀取mat數據(1)

[轉載]C++讀取mat數據(1)

 

2.       使用MATLAB 提供的MAT 文件接口函數

    在C/C++程序中有兩種方式可以讀取MAT文件數據。利用MATLAB提供的有關MAT文件的編程接口函數。MATLAB的庫函數中包含了MAT文件接口函數庫,其中有各種對MAT文件進行讀寫的函數,都是以mat開頭的函數。如表1所示。

表1  C語言中的MAT文件讀寫函數

MAT  函  數

功    能

matOpen

打開 MAT 文件

matClose

關閉 MAT 文件

matGetDir

從 MAT 文件中獲得 MATLAB 陣列的列表

matGetFp

獲得一個指向MAT 文件的ANSI C 文件指針

matGetVariable

從MAT文件中讀取MATLAB陣列

matPutVariable

寫MATLAB陣列到MAT文件

matGetNextVariable

從MAT文件中讀取下一個MATLAB陣列

matDeleteVariable

從MAT文件中刪去下一個MATLAB陣列

matPutVariableAsGlobal

從MATLAB陣列寫入到MAT文件中

matGetVariableInfo

從MAT文件中讀取MATLAB陣列頭信息

matGetNextVariableInfo

從MAT文件中讀取下一個MATLAB陣列頭信息

 

 

3.       程序舉例

目錄下有AA.mat 文件,內有一個名爲AMatrix的double 類型矩陣。代碼如下:

#include <stdio.h>

#include <stdlib.h>

#include "mat.h"

#include "iostream.h"

#include "mex.h"

#include "matrix.h"

 

int main()

{

  MATFile *pmat;

  const char **dir;

  const char *file;

  const char *name;

  int         ndir;

  mxArray *pa;

  file="E:\c++\exe\AA.mat";//雙反斜槓防止轉義

  pmat=matOpen(file, "r");//打開文件,返回指向文件指針

  if (pmat == NULL) {

    cout<<"Error opening file:"<<file<<endl;

           return(1);

  } 

  dir = (const char **)matGetDir(pmat, &ndir);

  //ndir 表示mat文件中含有矩陣數目

  if (dir == NULL) {

    cout<<"Error reading directory of file:"<<file<<endl;

    return(1);

  }

  else

  {

    cout<<"Directory of file:"<<file<<endl;

       for (i=0; i < ndir; i++)

      cout<<dir[i]<<endl;//輸出所含矩陣數目

  }*/

  pmat=matOpen(file, "r");//重新打開文件

  pa = matGetNextVariable(pmat, &name);

  //返回指向文件頭文件信息的指針,指針類型爲*mxArray

  //name 是矩陣的名字

         cout<<name<<endl;

  pmat=matOpen(file, "r");

  int ii=mxGetM(pa);//矩陣行數

  int jj=mxGetN(pa);//矩陣列數

  pm=mxGetPr(pa); //獲取矩陣數值,返回指向矩陣第一數值的指針

  cout<<*(pm++)<<endl;//輸出數據

  cout<<*(pm++)<<endl; //輸出數據

// cout<<*(pm++)<<endl;…

  mxFree(dir);

  return(1);

}

C++讀取mat文件:

1.vs2010的配置

    新建一個工程,在屬性管理器中選擇Debug|Win32->Microsoft.Cpp.Win32.user->VC++目錄。設置包含目錄爲:D:\MATLAB\R2010a\extern\include(我的matlab裝在D盤);設置庫目錄爲:D:\MATLAB\R2010a\extern\lib\win32\microsoft。如圖

matlab擴張編程

matlab擴張編程
 

 

2.設置環境變量path

      計算機->屬性->高級系統設置->高級->環境變量

在Path中已經存在d:\MATLAB\R2010a\bin\,但是d:\MATLAB\R2010a\bin\win32下有個重要的libmat.dll。如果不把d:\MATLAB\R2010a\bin\改爲d:\MATLAB\R2010a\bin\win32 程序將無法運行。

      理論上d:\MATLAB\R2010a\bin\應該會向深一步檢索到libmat.dll。坑爹的windows這一步並沒有去做,害哥花了一晚上才解決這個問題。這步設置完後要重啓(環境配置完畢)。

3.使用MATLAB 提供的MAT 文件接口函數

    在C/C++程序中有兩種方式可以讀取MAT文件數據。利用MATLAB提供的有關MAT文件的編程接口函數。MATLAB的庫函數中包含了MAT文件接口函數庫,其中有各種對MAT文件進行讀寫的函數,都是以mat開頭的函數。如表1所示。

表1  C語言中的MAT文件讀寫函數

MAT  函  數

功    能

matOpen

打開 MAT 文件

matClose

關閉 MAT 文件

matGetDir

從 MAT 文件中獲得 MATLAB 陣列的列表

matGetFp

獲得一個指向MAT 文件的ANSI C 文件指針

matGetVariable

從MAT文件中讀取MATLAB陣列

matPutVariable

寫MATLAB陣列到MAT文件

matGetNextVariable

從MAT文件中讀取下一個MATLAB陣列

matDeleteVariable

從MAT文件中刪去下一個MATLAB陣列

matPutVariableAsGlobal

從MATLAB陣列寫入到MAT文件中

matGetVariableInfo

從MAT文件中讀取MATLAB陣列頭信息

matGetNextVariableInfo

從MAT文件中讀取下一個MATLAB陣列頭信息

 

4.程序舉例:

D盤下有一個test.mat文件。代碼如下:

#include "mat.h"
#include <stdio.h>

//下面兩行參數很重要,沒有的話就會出現類似unresolved external symbol _matClose referenced in function _main的請況

//另一種方法就是:

對於需要操作.mat文件的工程,選擇菜單Property->linker,在彈出對話框中點選Link標籤,在Additional Dependencies中加入 libmx.lib、libmat.lib。下面是程序中的調用,以例子說明用法,必要時候如用到mxArray時候還要加入sgl.lib 和 libmatlbmx.lib。

#pragma comment(lib,"libmat.lib")
#pragma comment(lib,"libmx.lib")
int main()
{
 MATFile *pmat;
 const char **dir;
 const char *file;
 const char *name;
 int         ndir;
 mxArray *pa;
 file="D:\\test.mat";  //雙反斜槓防止轉義
 
 pmat=matOpen(file, "r");//打開文件,返回指向文件指針
 if (pmat == NULL)
 {
  printf("pmat==NULL");//cout<<"Error opening file:" <<file<<endl;
  return(1);
 }
 
 
 dir = (const char **)matGetDir(pmat, &ndir);
 //ndir 表示mat文件中含有矩陣數目
 if (dir == NULL)
 {
  printf("Error reading directory of file:");
  return(1);
 }else

 {
  printf("Directory of %s\n",file);
  for (int i=0; i < ndir; i++)
  printf("%s\n",dir[i]);//輸出所含矩陣數目
 }

return 0;
}

發佈了16 篇原創文章 · 獲贊 3 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章