matlab的mat格式

来源:互联网 发布:域名缩短器 编辑:程序博客网 时间:2024/06/05 19:31

MAT文件是matlab专用于保存数据至磁盘和想matlab导入、从matlab导出数据的数据文件格式。MAT提供了一种简单的机制,它允许两个平台之间以灵活的方式移动数据。为了简化在matlab环境之外对MAT文件的使用,matlab给出了一个lib,用于读写MAT文件。主要包括以下库函数matOpen(打开), matClose(关闭), matGetDir(), matGetFp()等等。

在不支持matlab平台的系统里使用MAT文件就需要自己根据MAT的格式读取其中的数据。MAT文件格式有version4,version5版本的。现在这里主要讲解version5版本的格式。

在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。

关于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。这个确实是有点复杂啊!

原创粉丝点击