上文介绍的是,运用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。下面将逐一进行介绍:
(未完待续)