上文介紹的是,運用matlab提供的api函數讀取mat文檔的數據,從調用的方法可以看出,存在着很大的局限性。因此本文從mat文件的格式,運用C++編程方式讀取mat文檔內容
擺脫matlab的api調用的束縛。
mat文檔的格式
在matlab version 5中,MAT文件由一個128字節的文件頭和若干個數據單元組成。每個數據單元有一個8個字節的tag,用於說明數據單元的占用的字節數(不包括tag的8個字節)和數據類型。
文件頭header里有124字節的文本描述區域和4個字節的flag。flag中的前2個字節說明version,后兩個字節是endian indicator。文本描述區域主要說明MAT文件的版本,創建於哪個平台,創建時間。flag中的version說明的是創建這個MAT文件的matlab的版本。edian indicator包括兩個字符M和I。
1 char mat_data_fhead1[51] = 2 {"MATLAB 5.0 MAT-file, Platform: PCWIN, Created on: "}; 3 char mat_data_fhead2[51] = {" "}; 4 char mat_data_fhead3[4] = {0, 0x01, 0x49, 0x4d}; 5 char* datetime = NULL; 6 time_t ltime; 7 tm* today; 8 9 time(ltime); 10 today = localtime(ltime); 11 datetime = asctime(today); 12 13 fwrite(mat_data_fhead1, 1, 50, fp); 14 fwrite(datetime, 1, 24, fp); 15 fwrite(mat_data_fhead2, 1, 50, fp); 16 fwrite(mat_data_fhead3, 1, 4, fp);
關於edian:endian: The ordering of bytes in a multi-byte number.
定義:在計算機系統體系結構中用來描述在多字節數中各個字節的存儲順序。相關概念還有MSB(Most Significant Bit/Byte)和LSB(Least Significant Bit/Byte)。在所有的介紹字節序的文章中都會提到字節序分為兩類:Big-Endian和Little-Endian。引用標准的Big-Endian和Little-Endian的定義如下:
a) Little-Endian就是低位字節排放在內存的低地址端,高位字節排放在內存的高地址端。
b) Big-Endian就是高位字節排放在內存的低地址端,低位字節排放在內存的高地址端。
c) 網絡字節序:TCP/IP各層協議將字節序定義為Big-Endian,因此TCP/IP協議中使用的字節序通常稱之為網絡字節序。
PS:有些文章中稱低位字節為最低有效位,高位字節為最高有效位。
如果edian indicator中的值為MI,則讀取MAT數據時應該用IM的順序。若對於16bit的數據,則要進行兩個字節數據的交換。
數據單元的格式
每個數據單元開頭都有8個字節的tag用於說明數據單元存儲的數據類型和字節數(不包括tag的8個字節)。version5支持多種數據類型。data type中的值為1到14。除了用數值表示某種類型外,還用標識單詞聯系一種類型。例如data type中存儲的是數值1時,代表8bit singed,它的標識單詞就為miINT8,方便了用戶記憶。值14的標志單詞是miMATRIX,代表一種矩陣數據。
數據單元tag中的字節數是每個數據單元不包括8個字節tag的數據字節個數。
接下來的就是存儲的數據。數據需要64bit對齊,不夠時要補齊到64bit。數據類型是miMATRIX時,數據單元tag中字節數包括矩陣中每個padding的數據個數。其他數據類型時,字節數不包括padding的個數。
當存儲的數據不超過4個字節時,還可以采用壓縮的數據單元格式。用4個字節存儲tag,另外4個字節存儲數據。在編程時,tag的前兩個字節不為零時,則說明采用的是壓縮的數據單元格式。在把數據寫入MAT文件中時,壓縮的數據單元格式是優先選擇的。
datatype值為14的數據類型是:array data,包括了各種類型的array,如數值矩陣,字符矩陣,稀疏矩陣。是一種復合類型結構。字節數包括所有subelement字節數之和。每個subelement都有自己的tag。主要有array flags, dimensions array subelement, array name subelement, real part(pr)subelement, image part subelement。下面將逐一進行介紹:
(未完待續)