MAT文件是MATLAB专用的用于保存数据至磁盘和向MATLAB导入、从MATLAB导出数据的数据文件格式。MAT文件提供了一种简便的机制,它允许你在两个平台之间以灵活的方式移动数据。而且,它还提供了一种途径来向其它单机MATLAB应用导入或者导出数据。

为了简化在MATLAB环境之外对MAT文件的使用,MATLAB给出了一个操作例程库,通过它,我们可以使用C/C++或者Fortran程序读写MAT文件。MATLAB是用M语言编程,不能在M文件中直接调用C语言程序。可以通过MATLAB提供的应用编程接口(API)来实现与外部的接口,在MATLAB环境中实现调用C语言或Fortran程序、输入或输出数据以及和其他软件程序间建立客户/服务器关系等功能。

MAT 文件

MAT文件是MATLAB使用的一种特有的二进制数据文件。MAT文件可以包含一个或者多个MATLAB 变量。MATLAB通常采用MAT文件把工作空间的变量存储在磁盘里,在MAT文件中不仅保存各变量数据本身,而且同时保存变量名以及数据类型等。所以在MATLAB中载入某个MAT文件后,可以在当前MATLAB工作空间完全再现当初保存该MAT 文件时的那些变量。这是其他文件格式所不能的。同样,用户也可以使用MAT文件从MATLAB环境中导出数据。MAT文件提供了一种更简便的机制在不同操作平台之间移动MATLAB数据。

2.5.1

在MATLAB环境中,通常使用load和save两个命令进行 MAT 文件的读和写。在默认情况下,这两个命令以 MAT 文件格式处理文件,但是也可以用–ascii参数选项来强制用文件方式处理文件。关于这点已经在本章介绍过了,这里主要介绍如何读写MAT文件。

1. load 函数的使用

load函数可以从MAT文件中读取数据,例如要读取mymat.dat文件,可以直接执行命令load mymat.dat,因为给出要读取的文件的后缀名是MAT,因此命令则以MAT文件格式读取数据,否则将以文本文件读取数据。命令中的文件名可以包含单引号,也可以不包含,也就是说该函数也可以这样调用:load 'mymat.mat' 。

load 函数还可以指定只读取文件中的某几个变量,只需在文件名之后列出想要读取的变量的变量名就可以了,变量名也可以使用通配符。

比如命令load mymat.mat y*,执行结果就是将文件中所有以y开头的变量读取出来。

load还有一种函数形式的调用方式。这种调用方式就要求文件名必须是字符串,比如要导入mymat.mat文件,那么函数形式的调用必须是s = load('mymat.mat')。

2. save函数的使用

save 函数的功能是把当前MATLAB工作空间的一个或多个变量存写到外部文件。在默认情况下,save 函数以MAT格式存写数据。若在命令中直接调用该函数,不带任何参数,执行结果是把MATLAB工作空间的所有变量保存到系统默认的matlab.mat文件中。当然,带上文件名参数,就可以将当前工作空间中的所有变量存写在指定的 MAT文件中。

如果用户需要保存指定的某几个变量,只需在文件名参数后,列出要保存的文件名即可。比如,命令save mymat.mat x,y,z执行后的结果就是将当前工作空间中的变量 x,y,z保存到mymat.mat文件中,要求x,y,z是当前工作空间中已经存在的变量。

2.5.2 在普通的C/C++程序中读写MAT文件

1.使用MATLAB 提供的MAT 文件接口函数

在C/C++程序中有两种方式可以读取MAT文件数据。一种是利用MATLAB提供的有关MAT文件的编程接口函数。MATLAB的库函数中包含了MAT文件接口函数库,其中有各种对MAT文件进行读写的函数,都是以mat开头的函数。如表2-10所示。

表2-10 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阵列头信息

2.在C/C++程序中读取MAT文件内容

另外一种在C/C++程序中读写 MAT 文件的方法是根据 MAT 文件结构,以二进制格式在C/C++中读入文件内容,然后解析文件内容,从而获得文件中保存的MATLAB数据。因为MAT文件格式是公开的,用户只要在找到安装路径下的一个名为matfile_format,pdf的文件,就可以详细了解 MAT 文件结构,从而在C/C++程序中以二进制格式读取文件内容,解析以后得到文件中保存的数据。具体方法在后面章节有详细讲解。

MEX文件

MATLAB中调用C语言程序,必须通过MEX文件来实现。

C语言的MEX文件的结构

C语言的MEX文件是一种动态连接子程序,可以象调用M文件一样调用它。MEX文件主要有以下几方面的应用:

(1)在MATLAB中,M文件的计算速度特别是循环迭代的速度远比C语言慢,因此可以把要求大量循环迭代的部分用C语言编写为MEX文件,提高计算速度。

(2)已经开发的C语言程序,则不必将其转化为M文件而重复劳动,通过添加入口程序mexFunction,可以由MATLAB调用。

(3)直接控制硬件,如A/D采集卡,D/A输出卡等,以用于数据采集或控制应用。

C语言的MEX文件的源程序由两个非常明显部分组成:

(1)计算程序,即在MEX文件中完成计算功能的程序代码,计算程序可以是普通的C语言程序,按照C语言规则编写即可

(2)入口程序,将计算程序与MATLAB连接的入口函数mexFunction。入口程序mexFunction相对要复杂一些,函数中有四个参数nlhs、plhs、nrhs和prhs。这里nlhs是输出数据的个数,plhs是指向mxArray(MATLAB中所有数据都由mxArray定义)的输出数据的指针,nrhs是输入数据的个数,prhs是指向mxArray的输入数据的指针。

【补充】:

《MATLAB6.5 应用接口编程》上对mat的详细介绍:

1、数据输入方式:

1) 显示的输入

数据量小,从command window中输入

如: a=[1,2,3,4,5];

2) M文件形式输入

数据量较大,通过编写矩阵输入语句的M文件的执行进行输入

3) ASCII码数据文件的输入

要求ASCII码的数据文件中的数据形式必须是一个矩阵,要求每一行的数据个数

必须相同,每行数据对应矩阵的一行,每行的元素用空格分开。

命令形式: load 文件名(带扩展名)

4) 底层I/O输入方式

可以直接打开(fopen)和读文件(fread),以及其他的一系列函数底层I/O函数

主要用于装入某种特定格式的数据文件。

5) MEX动态程序输入

用已有的c或者FORTRAN等子程序读取特殊格式的数据文件,再用MEX子程序转换成MAT数据文件,再用LOAD

6) 外部程序转换

2、 MATLAB数据输出

1) 小型数据输出

通过用diary命令生成包含命令窗口内的内容的文件,可以将diary文件剪接到其他的文件或者报告中。

生成的diary文件可以用文本编辑器来编辑。如:

>> diary on

>> d=[ 1 2 3]

d =

1 2 3

>> whos

Name Size Bytes Class

d 1x3 24 double array

Grand total is 3 elements using 24 bytes

>> diary off

用记事本或者其他文本编辑器打开当前目录下的diary,就可以看到当前内容

2) ASCII码数据输出

用带 -ASCII选项的save命令,如:

A=rand(4,3);

save temp.dat A -ascii

生成的temp.dat的ASCII码文件,包含矩阵A的全部数据

3) 底层I/O输出

利用fopen和fwrite或者其他的底层I/O函数

4) MEX程序输出

5) MAT格式输出

用save,如:

a=rand(3,3);

save adata a

3. MAT 文件格式

它把文件存储为二进制格式,一般情况下,不需要了解MAT的具体格式,因为我们一遍使用MATLAB API来完成MAT文件的读取与存储,它屏蔽了MAT文件格式。然而,若要在一个MATLAB API不支持从系统中读写MAT文件,用户就必须了解MAT文件的存储格式。

MAT文件由128bytes 的MAT 文件头和尾随其后的数据单元组成,每个数据单元头部都有一个8字节的标志,表示这个数据单元里有多少数据,以及以什么方式读写这里的数据。一般读写方式有16位、32位、浮点或别的形式。MAT文件的结构如下图:

1. MAT文件头包括:

1)描述信息:

a. MATLAB 版本

b. MAT文件创建的平台

c. 数据和文件被创建的时间

这些信息是文本格式的,可以在UNIX系统下用cat命令,在Windows系统中用type命令

例如:

>> type ddd.mat

MATLAB 5.0 MAT-file, Platform: PCWIN, Created on: Mon Apr 12 21:55:06 2004

2)标志域

MAT文件头的最后4个字节被分成两个16位整数,称为标志域,其含义如下:

2. MAT文件的数据单元格式

1) 标志

8个字节,包括数据类型与字节数

具体说明见书^_^

2) 数据

必须在64位边界上对准,不全则补丁字节,使得下一个数据单元的标志从64位边界上开始。

3. 数据元素的一个例子

见后面的附图

4. 压缩数据元素格式

见书P79 在MATLAB中读写MAT文件

更多推荐

matlab 文件打开方式,mex文件和mat文件打开方式