MATLAB 读入数据的几种方式探讨 谢良喜 孔建益 王兴东 张陵保 李公法 汤勃 赵刚 1 1(武汉科技大学机械自动化学院,武汉 430081)2( ) Several Methods of Importing Data into Matlab Xie Liangxi, Kong Jianyi (Wuhan University of Science & Technology, Wuhan 430081) [摘要 摘要]: Matlab 中有不同的函数用于读取数据,它们的特点不同,适用的场合也各不相同。本文结合工 摘要 程实例,对几个常用的读取数据方式进行了比较分析,并对函数的选择提出了建议。 关键词:故障诊断 MATLAB 关键词 [Abstract]: There are many functions to import data into Matlab from a database file. It’s important to select a suitable function for your test. In this article, the author introduces three functions with comparing their difference, and gives his advice. Keyword: Fault-detection, Matlab 中图分类号:TP311.1 一. 问题的提出 在典型的机械设备离线检测与故障诊断中,常常将数据采集与数据处理做成分开的模 块。因为采集卡通常自带数据采集程序并可方便地将数据保存成指定格式文件;而 MATLAB 以其丰富而专业的函数库、完善的数据处理功能和强大的图形输出能力,被越来 越多地作为信号分析处理的基础平台。因此,离线检测中,通常在采集卡采集数据后,将 数据以指定格式保存在计算机硬盘,常见的文件格式包括 txt 格式、dat 格式等等;在数据 后处理阶段,通过 MATLAB 读取数据并进行各种运算与处理。 读取数据是应用 MATLAB 进行数据分析的首要步骤。MATLAB 用于数据读取的函数 很多,不同函数有不同的用法和应用场合。如果错误选用了不合适的函数,不仅运行效率 低下,还可能导致程序不能正常开展工作。因此,在充分了解各函数的特点和用法的前提 下,根据应用的需要选择合适的数据读取方式是重要的。 二. 常用文件读入方式 MATLAB 提供多种 I/O 方式进行数据交换,常见的数据输入函数包括: 1. Scanf 函数:从文件中读入数据并对数据进行格式转换。语法为: [A,count] = fscanf(fid,format,size) 该语句利用 fscanf 函数,从指定文件中读取数据并将数据转换成 format 参数指定的格 式,写入矩阵 A。Count 参数用于返回成功读入的元素数量,为可选参数。输入参数中,fid 是用 fopen 打开文件时返回的文件标识;size 用于指定读入数据的元素数量,该参数可选, 如果不指定则将文件的全部数据读入;format 用于指定数据格式,常见格式有’%c’,’%d’ 等。 2. Fread:从仪器(包括文件)中读入二进制数据。语法为: [A,count] = fread(fid,size,precision,skip) 该语句利用 Fread 函数,从指定文件中读取二进制数据并写入矩阵 A。Count 参数用于 返回成功读入的元素数量,为可选参数。输入参数中,fid 是用 fopen 打开文件时返回的文 件标识;size 用于指定读入数据的元素数量,该参数可选,如果不指定则将文件的全部数 据读入; precision 指定读入数据的精度, 该参数可选, 如果不指定, 其缺省值为'uchar'; skip 也是可选参数,称作循环因子,若指定 shikp 值且该值不为 1,则循环跳跃读取数据,即按 skip 指定的比例,周期性跳过一些数据,使得读取的数据具有选择性。 ———————————————————————————————————— 谢良喜,男,1971 年生,武汉科技大学机械自动化学院讲师。从事机械设计、机械制造工艺、制造企 业信息化、机械设备故障诊断方面教学与研究。 3. Load:该函数是 MATLAB 中最常用的函数之一,一般用于载入 MATLAB 格式的 数据,即保存在*.mat 文件中的数据。然而,该函数也可以从其它格式文件中载入数据,例 如*.txt 、 *.dat 文件。 fscanf 与 fread 函数在读取数据时的作用大同小异,它们的特点是:不论数据文件中数 据是否具有确定的规律,均可以将数据文件的全部数据读入,因而在读取数据时显得更加 灵活;而 load 函数在载入数据时,要求数据文件中的数据是有规律排列的,数据的排列类 似矩阵或表格形式,否则不能成功读取数据。 三. 应用实例 在某次测试时,为了方便直接阅读数据文件,采用 txt 格式保存数据,并在测试数据前 增加了一些描述性文字。数据文件的部分内容如下图一。 图一:数据格式 由于加入了一段说明性文字,文件中数据的含义更加直观,便于测试者直接阅读数据; 但导致文件中的数据既包含数值型数据,也包含字符型数据;数据的排列也没有全部按矩 阵格式,因而无法直接用“Load”函数载入数据。若使用“Load”函数读取以上数据,就 会出现错误。 下图二是读取该数据的程序源代码。 图二:用 fread 函数读取不规则数据源代码 上例中,为了方便用户选择存放在不同地址、不同文件中的源数据文件,使用了 “uigetfile”函数,用以产生交互式对话框(见图三) 。使用“fread”函数读入数据的前, 首先要打开文件;读取数据结束后,要关闭该文件。上例同样可以使用“fscanf”函数。 对于图一所示格式的数据,是不能使用“Load”函数的,否则会提示错误。 以上可见, “fread”或“fscanf”函数比较灵活,对数据文件的格式要求并不严格;可 以将任意格式文件的数据读入,以便在后续程序中对数据进行整理。但与“Load”函数相 比,由于读取数据的机制不同, “fscanf”或“fread”读取数据的效率相对较低,当数据规 模比较大时,运行速度显著降低;若数据文件规模达到一定程度时,可能出现“Out of Memory”错误。而“Load”函数虽然效率高,但对数据文件格式要求比较严,要求数据是 严格的矩阵格式,因而其适用范围受到一定限制。 图三:选择数据文件对话框 四. 结语 Matlab 包含各种数据读入函数,不同函数的语法和应用场合各不相同; “Load”函数不 仅语法简单,且读取数据的效率更高,对数据长度没有严格限制。 一般来说,从数据采集卡读取的数据就是严格的矩阵格式;为了提高数据处理的整体 效率,保证源数据格式的规范性,一般不宜将采集卡输出的数据直接进行添加或删除字符 的操作,而应直接将采集卡数据取出存盘,由 Matlab 读取后进行各类处理。 参考文献: 参考文献: [1] 张志涌等,精通MATLAB6.5版,北京:北京航空航天大学出版社,2003 [2] Mathworks,Help of Matlab. [3] 邹鲲等,Matlab 6.x信号处理,北京:清华大学出版社,2002 [4] 陈亚勇等,Matlab信号处理详解,北京:人民邮电出版社,2001 [5] 梁虹等,信号与系统分析及Matlab实现,电子工业出版社,2002