C++讀寫.mat檔案的方法

來源:互聯網
上載者:User

最近在編寫C++程式的過程中,需要使用matlab產生的.mat檔案,於是尋找了基本使用方法。

我的電腦環境是win7 64位系統,VS2010,matlab R2010b。

一、工程配置:
1.VC++目錄->包含目錄 添加:
MATLAB\R2010b\extern\include
MATLAB\R2010b\extern\include\win64
->庫目錄 添加:
MATLAB\R2010b\extern\lib\win64\microsoft
MATLAB\R2010b\extern\lib\win32\microsoft
2.C/C++->常規->附加元件封裝含目錄 添加:
MATLAB\R2010b\extern\include
MATLAB\R2010b\extern\include\win64
3.連結器->輸入->附加依賴庫 添加:
libmat.lib
libmx.lib
libmex.lib
libeng.lib

由於所安裝的matlab為64位,要調用其函數,需要將工程轉換為X64
4.頂菜單->產生->組態管理員->平台:X64
5.連結器->進階->目標電腦:
MachineX64(/MACHINE:X64)

6.電腦環境變數->path 添加:
E:\DevTools\MATLAB\R2010b\extern\lib\win64\microsoft;
E:\DevTools\MATLAB\R2010b\bin\win64;

二、所用到的基本讀取寫入mat檔案程式碼範例:

首先需要包含標頭檔:

複製代碼 代碼如下:#include <mat.h>

[cpp] view plaincopy

MATFile *pmatFile = NULL;
mxArray *pMxArray = NULL;

// 讀取.mat檔案(例:mat檔案名稱為"initUrban.mat",其中包含"initA")
double *initA;

pmatFile = matOpen("initUrban.mat","r");
pMxArray = matGetVariable(pmatFile, "initA");
initA = (double*) mxGetData(pMxArray);
M = mxGetM(pMxArray);
N = mxGetN(pMxArray);
Matrix<double> A(M,N);
for (int i=0; i<M; i++)
for (int j=0; j<N; j++)
A[i][j] = initA[M*j+i];

matClose(pmatFile);
mxFree(initA);

// 產生.mat檔案
double *outA = new double[M*N];
for (int i=0; i<M; i++)
for (int j=0; j<N; j++)
outA[M*j+i] = A[i][j];
pmatFile = matOpen("A.mat","w");
mxSetData(pMxArray, outA);
matPutVariable(pmatFile, "A", pMxArray);
matClose(pmatFile);

三、程式說明

1.使用matOpen函數開啟mat檔案

MATFile *matOpen(const char *filename,const char *mode)

mode:
r:以唯讀方式開啟
u:更新模式,可讀可寫,但是如果要開啟的資料檔案不存在,也不會建立新的檔案
w:以寫入方式開啟,只能寫如入,如果要開啟的資料檔案不存在,則建立一個新的檔案

2.使用matGetVariable函數讀取mat檔案中的變數

mxArray * matGetVariable(MATFile * pMF, const char * name);

讀取名為name的變數,返回一個資料陣列指標

3.使用mxGetData函數擷取資料陣列中的資料

void *mxGetData(const mxArray *pa );

返回時需要使用強制類型轉換。

4.使用mxGetM和mxGetN函數擷取資料陣列矩陣的維數

size_t mxGetM(const mxArray *pa);

size_t mxGetN(const mxArray *pa);

5.使用mxSetData函數將變數存入資料陣列

void mxSetData( mxArray *pa, void *newdata );

6.使用matPutVariable函數將資料陣列存入到mat檔案中

int matPutVariable(MATFile * pMF, const char * name, const mxArray * pA);

存入成功返回0,存入出錯返回非0

7.由於malab中矩陣的儲存是按列儲存,與c中不同,所以從mat檔案中擷取的矩陣需要重新排列。產生mat檔案時,同樣要注意。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.