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文件打开方式
发布评论