Matlab的各种数据读取文件读写等操作汇总.docx
- 文档编号:9364537
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:13
- 大小:24.83KB
Matlab的各种数据读取文件读写等操作汇总.docx
《Matlab的各种数据读取文件读写等操作汇总.docx》由会员分享,可在线阅读,更多相关《Matlab的各种数据读取文件读写等操作汇总.docx(13页珍藏版)》请在冰豆网上搜索。
Matlab的各种数据读取文件读写等操作汇总
Matlab的各种数据读取、文件读写等操作汇总
MATLAB提供了多种方式从磁盘读入文件或将数据输入到工作空间,即读取数据,又叫导入数据;将工作空间的变量存储到磁盘文件中称为存写数据,又叫导出数据。
至于选择哪种机制,则根据下面两个因素决定:
●用户所执行的操作是导入数据还是导出数据;●数据的格式为文本格式、二进制格式还是如HDF之类的标准格式。
将数据导入MATLAB中最容易的方法就是使用导入数据模板(ImportWizard),使用该模板时不需要知道数据的格式,只需指定包含这些数据的文件,然后导入模板会自动处理文件内容。
本章重点内容如下:
●文件的打开和关闭●文本文件的读取●存写ASCII数据●二进制数据的读取●二进制数据的存写●使用I/O文件函数进行数据读写●MAT文件的读写
2.1文件的打开和关闭2.1.1文件的打开无论是要读写ASCII码文件还是二进制文件,都必须先用fopen函数将其打开,在默认情况下,fopen以二进制格式打开文件,它的使用语法如下:
fopen('filename','mode')其中filename表示要读写的文件名称,mode则表示要对文件进行的处理方式,如下:
rt:
以只读方式(Reading)打开文件wt:
以只写方式(Writing)打开文件at:
以追加方式(Appending)打开文件,新内容将从原文件后面续写r+t:
以同时读写方式打开文件w+t:
以同时读写创建文件,原文件内容被清除a+t:
以同时读和追加(ReadingandAppdending)方式,原文件内容被保留,新内容将从原文件的后面开始At:
以读写方式打开或创建文件,适用于对磁带介质文件的操作Wt:
以写入方式打开或创建文件,原文件内容被清除,适用于磁带介质文件的操作
fopen函数有两个返回值,一个是返回一个文件标志(fileIdentifier),它会作为参数被传入其他对文件进行读写操作的命令,通常是一个非负的整数,可用此标识来对此文件进行各种处理。
如果返回的文件标识是–1,则代表fopen无法打开文件,其原因可能是文件不存在,或是用户无法打开此文件权限。
另一个返回值就是message,用于返回无法打开文件的原因。
为了安全起见,最好在每次使用fopen函数时,都测试其返回值是否为有效值。
下面以脚本m文件为例来声明文件的打开。
例2-1%exam1.m[f,message]=fopen('fileexam1','r')iff==-1disp(message);%显示错误信息end若文件fileexam1不存在,则显示如下信息。
Cannotopenfile.existence?
permissions?
memory?
...
例2-2%exam2.m[f,message]=fopen('fileexam2','r');iff==-1disp(message);%显示错误信息elsedisp(f);end若文件fileexam2存在,则返回f值。
2.1.2文件的关闭一旦完成文件的读写,最好关闭文件,以便对其进行其他操作。
这时就可以使用fclose函数来关闭文件,其适用语法如下:
fclose(f)。
其中f为打开文件的标志,若fclose函数返回值为0,则表示成功关闭f标志的文件;若返回值为–1,则表示无法成功关闭该文件。
一般来说,在完成对文件的读写操作后就应关闭它,以免造成系统资源浪费。
此外,需注意的是,打开和关闭文件都比较耗时,因此为了提高程序执行效率,最好不要在循环体内使用文件。
若要一次关闭打开的所有文件,可以使用下面的命令:
fcloseall
2.2文本数据虽然MATLAB自带的MAT文件为二进制文件,但为了便于和外部程序进行交换以及方便查看文件中的数据,也常常采用文本数据格式与外界进行数据交换。
在文本格式中,数据采用ASCII码格式,可以表示字母和数字字符。
ASCII文本数据可以在文本编辑器中查看和编辑。
MATLAB提供多种函数能够进行文件读写,这些函数都是MATLAB的一部分,不需要额外的工具箱支持。
2.2.1从文本文件中读取数据1.使用导入模板来读取数据使用导入模板来读取数据,需按以下步骤进行:
(1)选择File→ImportData选项,然后弹出一个文件选择对话框;也可以使用uiimport函数来打开导入数据模板。
(2)在文件选择对话框中选择想导入数据的文本文件,然后单击Open按钮,导入数据模板就会打开该文件并准备处理其内容。
(3)指定用于分开单个数据的字符,该字符称为分隔符或列分隔符。
在多数情况下可以用导入模板来设定分隔符。
(4)选择要导入的变量。
在默认情况下,导入模板将所有的数值数据放在一个变量中,而将文本数据放在其他变量中。
(5)单击Finish按钮完成数据的导入。
当使用导入模板来打开一个文本文件时,在导入模板对话框的预览区仅显示原始数据的一部分,通过它,用户可以验证该文件中的数据是否为所期望的。
导入模板也根据文件中的数据分隔符来对导入的数据进行预处理。
在导入模板中打开工作区中的grade.txt文件。
englishmathphysicjoe809060susan789888rob679089
图2-1将数据通过模板导入在图2-1中,导入模板已辨认space字符,把它作为文件中数据的分隔符,并建立了两个变量:
data(包含文件中所有数值数据)和textdata(包含文件中所有文本数据)。
当导入模板正确导入文件中的数据后,就会显示它所建立的变量。
要选择一个变量来导入数据,可单击它名称后面的复选框。
在默认情况下,所有变量都会被选中。
在导入对话框的右面显示了导入模板建立的变量内容。
要查看其他变量,只需要单击该名称。
在选择好要导入的变量后,单击Next按钮,如图2-2所示。
图2-2使用模板查看各变量数据在默认情况下,导入模板将文件中所有的数值数据放在一个变量中;若文件包含文本数据,则模板将它们放在另外一个变量中;若文件包含行或列,模板也将它们作为各自独立的变量分别称为行头和列头。
当所有导入模板创建好数据后,使用whos命令可以查看工作空间的变量。
>>whos
NameSizeBytesClassAttributes
data3x372doubletextdata4x1314cell
2.使用函数来读取文本数据若要在命令行或在一个M文件中读取数据,必须使用MATLAB数据函数,函数的选择则是依据文本文件中数据的格式。
而且文本数据格式在行和列上必须采取一致的模式,并使用文本字符来分隔各个数据项,称该字符为分隔符或列分隔符。
分隔符可以是space、comma、semicolon、ab或其他字符,单个的数据可以是字母、数值字符或它们的混合形式。
文本文件也可以包含称之为头行的一行或多行文本,或可以使用文本头来标志各列或各行。
在了解要输入数据的格式之后,便可以使用MATLAB函数来读取数据了。
若对MATLAB函数不熟悉,可从表2-2中了解几个读取函数的一些使用特征。
表2-2读取函数的比较函数|数据类型|分隔符返回值csvread|数值数据|仅cooma|1dlmread|数值数据|任何字符|1fscanf|字母和数值|任何字符|1load|数值数据|仅space|1textread|字母和数值|任何字符|多返回值
3.读取数值文本数据若用户的数据文件只包含数值数据,则可以使用许多MATLAB函数,这取决于这些数据采用的分隔符。
若数据为矩形形状,也就是说,每行有同样数目的元素,这时可以使用最简单的命令load(load也能用于导入MAT文件,该文件为用于存储工作空间变量的二进制文件,如果文件名后缀是.dat,则MATLAB会以MAT文件格式进行读取)。
例如,文件my_data.txt包含了两行数据,各数据之间由space字符隔开。
当使用load时,它将读取数据并在工作空间中建立一个与该文件同名的变量,但不包括扩展名。
>>loadmy_data.txt;调用whos命令查看工作空间的变量。
>>whos
NameSizeBytesClassAttributes
data3x372doublemy_data3x496doubletextdata4x1314cell此时可以查看与该文件同名的变量的值>>my_data
my_data=
0.32420.43240.34550.67540.45660.93680.98920.92740.46580.28320.93730.8233若想将工作空间的变量以该文件名命名,则可以使用函数形式的load,下面的语句将文件导入工作空间并赋给变量AA=load('my_data.txt');
4.读取有分隔符的ASCII数据文件如果数据文件不使用空格符而是使用逗号或是其他符号作为分隔符,用户可以选择多个可用的导入数据函数。
最简单的便是使用函数dlmread。
举个例子来说,一个名为lcode.dat的数据文件,数据内容由逗号分隔。
0.3445,0.8433,0.78650.7562,0.4233,0要把该文件的全部内容读入阵列A,只须输入如下命令:
>>A=dlmread('lcode.dat',',')即可以把数据文件中使用的分隔符作为函数dlmread的第二个参数。
注意:
即使每行的最后一个数据后面不是逗号,dlmread函数仍能正确读取数据,因为dlmread忽略了数据之间的空格符。
因此,即使数据为如下格式,前面的dlmread命令仍能正常工作。
A=
0.34450.84330.78650.75620.42330另外需要注意的是,分隔符只能选取单个字符,不能用字符串来作为分隔符。
5.使用文本头读取数值数据要读取一个包含文本头的ASCII码数据文件,可以使用textread函数,并指定头行参数。
调用函数textread同样非常简单,同时对文件读取的格式处理能力更强,函数接收一组预先定义好的参数,由这些参数来控制变量的不同方面。
Textread既能处理有固定格式的文件,也可以处理无格式的文件,还可以对文件中每行数据按列逐个读取。
textread函数常见的调用方法有如下几种:
[A,B,C...]=textread('filename','format')[A,B,C...]=textread('filename','format',N)例如文件my_data.txt包含了如下文件内容,有一行文本头,且格式化的数值数据。
num1num2num3num40.32420.43240.34550.67540.45660.93680.98920.92740.46580.28320.93730.8233因为有文件头,要使用如下textread命令来读取文件中的数据。
>>[num1num2num3num4]=textread('my_data.txt','%f%f%f%f','headerlines',1)执行结果如下:
num1=
0.32420.45660.4658num2=
0.43240.93680.2832num3=
0.34550.98920.9373num4=
0.67540.92740.8233
6.读取字母数值混合的数据若数据文件中包含了字母和数值混合的ASCII码数据,也可以使用函数textread来读取数据。
由上一小节知道,函数textread可以返回多个输出变量,实际上用户还可以通过参数指定每个变量的数据类型。
例如要把文件my_exam.dat的全部内容读入工作空间,需要在textread行数的输入参数中指定数据文件的名称和格式。
文件my_exam.dat包含的混合的字母和数值如下:
JoegradeA4.9passsusangradeD2.0fail如果想把4列数据全部读取出放在4个变量中,则使用如下命令:
>>[namegragradesanswer]=textread('my_exam.dat','%s%s%f%s')在这里要注意命令中格式字符串的定义,对于格式字符串中定义的每种变换,必须指定一个单独的输出变量,textread函数按格式字符串中指定的格式处理文件中的某个数据项,并把值放在输出变量中。
输出变量的数目必须和格式字符串中指定的变换数目项匹配,在该例中,函数按格式字符串来读取文件my_exam.dat的每一行,直到文件读完,该命令的执行结果是:
name=
'Joe''susan'gra=
'gradeA''gradeD'
grades=
4.90002.0000answer=
'pass''fail另外,textread函数可以有选择地读取数据,比如我们不需要取出中间几列数据,只取出第一列和最后一列数据,则可以使用命令:
>>[nameanswer]=textread('my_exam.dat','%s%*s%*f%s')
name=
'Joe''susan'
answer=
'pass''fail'若文件采用的分隔符不是空格,则必须使用函数textread,将该分隔符作为它的参数。
例如,若文件my_exam.dat使用分号作为分隔符,则读入该文件需使用如下命令:
[namegragradesans]=textread('my_exam.dat','%s%s%f%s','delimiter',';')2.2.2存写ASCII码数据本小节介绍如何使用MATLAB函数按几种通用的ASCII码格式来存写数据,即如何使用这些函数来把一个MATLAB数值矩阵写入到一个文本文件中,其中该矩阵的列和行使用空格符来分隔。
用户采用什么函数取决于所要存写数据的数据量和数据格式。
常用的两种ASCII码数据格式如下:
●采用空格符分隔;●采用分号分隔。
MATLAB的存写数据函数如表2-3所示。
表2-3数据存写函数函数名称|适用数据|分隔符csvwrite|数值数据|逗号diary|数值数据或单元阵列|空格dlmwrite|数值数据|任何字符fprintf|字母和数值数据|任何字符save|数值数据|制表符或空格符
1.存写有分隔符的ASCII码数据文件若要将当前的MATLAB工作空间的一个或多个变量写到一个有分隔符的ASCII码文件中,可以使用save命令或dlmwrite函数。
在默认情况下,save命令是以MAT格式存写数据的,这部分内容我们在后面详细介绍,本小节主要介绍save命令通过ASCII码限定符以文本方式存写数据。
而dlmwrite函数则可以提供更大的灵活性,它允许用户把任何字符指定为分隔符,也可以通过指定一个值域存写一个阵列的子阵列。
>>clearall;>>x=rand(2,3);>>savemy_test1.datx-ascii;该命令将变量x中的数据存写到my_test1.dat文件中。
通过文本编辑器,我们可以查看该文件的内容:
9.2181297e-0011.7626614e-0019.3546970e-0017.3820725e-0014.0570621e-0019.1690444e-001我们也可以将命令中的文件名和变量名省略,那样的话,命令的执行结果则是把当前MATLAB工作空间中的所有变量保存到matlab.mat文件中。
需要指明的是这时的文件虽然后缀名为.mat,但文件内容仍然是以文本方式保存的。
在默认情况下,save命令使用空格作为分隔符,但用户可以通过指定-tabs限定符来使用制表符而不是空格符作为分隔符。
当使用save命令把一个字符阵列写入ASCII文件时,将ASCII码写入文件也就等于把字符写入文件。
若要以ASCII码形式存写一个阵列,并指定文件使用的分隔符,需要使用dlmwrite函数,比如重新指定分号作为分隔符,把变量x存到文件my_test2.dat文件中,查看其结果:
0.92181;0.17627;0.935470.73821;0.40571;0.9169在默认情况下,dlmwrite函数用逗号或空格作为分隔符,或者是指定空的引号,即无分隔符。
2.使用diary命令来存写数据较小的数值阵列或单元阵列的存写可以使用diary命令,例如,在工作空间中有一个阵列A:
A=[12345;678910]在命令提示符下执行如下命令:
diarymy_test3.dat,就可以创建my_test3.dat文件。
接下来显示要存写的阵列A:
A=12345678910然后执行关闭diary命令:
diaryoff。
这时,在文本编辑器中打开my_test3.dat文件,会发现diary命令创建的文件记录了在MATLAB会话期间的所有命令。
可以通过编辑,删去无关的文本。
2.3二进制数据2.3.1二进制数据的读取本小节将介绍怎样将一般格式下的二进制数据文件读取到工作空间中。
读取二进制数据常用的方法有两种,一是使用导入模板来导入,二是使用二进制数据导入函数来读取。
1.使用导入模板读取二进制数据要使用导入模板来读取二进制数据,需按以下步骤进行:
(1)选择File→ImportData选项,弹出一个文件选择对话框;也可以使用uiimport函数来打开导入数据模板。
(2)在文件选择对话框中选择想导入数据的二进制数据文件,然后单击Open按钮,导入数据模板就会打开该文件并准备处理其内容。
(3)选择要导入的变量。
在默认情况下,导入模板将要建立的变量取决于文件中的数据类型。
(4)单击Finish按钮完成数据的导入。
这个过程和使用导入模板读取文本文件是基本一致的,这里就不再举例了。
2.使用导入函数读取二进制数据若要从命令行或一个M文件中读取二进制数据,就必须使用MATLAB导入函数,函数的选择取决于文件中数据的格式,这些函数如表2-4所示。
表2-4导入二进制数据函数函数名称|读取文件的扩展名|数据格式load|.mat|读取MATLAB下的MAT数据格式的数据aviread|.avi|读取AVI格式的音频视频数据cdfread|.cdf|读取CDF格式的数据hdf|.hdf|读取HDF格式的数据imread|.bmp.cur.gif.hdf.ico.jpg.pbm.pgm.png.pnm.ppm.pcx.tif.xwd.ras|读取各种格式的图形数据wavread|.wav|读取Windows系统的声音文件xlsread|.xls|读取Excel电子表格数据2.3.2二进制数据的存写要以一种标准二进制格式来存写二进制数据,可以使用MATLAB提供的高端函数,函数的选择取决于要存写数据的类型,这些函数如表2-5所示。
表2-5导出二进制数据函数函数名称|读取文件的扩展名|数据格式save|.mat|存写MATLAB下的MAT数据格式的数据avifile|.avi|存写AVI格式的音频视频数据cdfwrite|.cdf|存写CDF格式的数据hdf|.hdf|存写HDF格式的数据imwrite|.bmp.cur.gif.hdf.ico.jpg.pbm.pgm.png.pnm.ppm.pcx.tif.xwd.ras|存写各种格式的图形数据wavwrite|.wav|存写Windows系统的声音文件xlswrite|.xls|存写Excel电子表格数据
在MATLAB中可以将一系列的图像保存为电影,这样使用电影播放函数就可以进行回放,保存方法可以同保存其他MATLAB工作空间变量一样,通过采用MAT文件格式保存。
但是若要浏览该电影,必须在MATLAB环境下。
在以某种格式存写一系列的MATLAB图像时,不需要在MATLBA环境下进行预览,通常采用的格式为AVI格式。
AVI是一种文件格式,在PC机上的Windows系统或UNIX操作系统下可以进行动画或视频的播放。
若要以AVI格式来存写MATLAB图像,步骤如下:
(1)用avifile函数建立一个AVI文件。
(2)用addframe函数来捕捉图像并保存到AVI文件中。
(3)使用close函数关闭AVI文件。
注意:
若要将一个已经存在的MATLAB电影文件转换为AVI文件,需使用函数movie2avi。
函数原型为:
movie2avi(mov,filename)movie2avi(mov,filename,param,value,param,value...)2.4使用文件I/O函数前面介绍的都是MATLAB中的一些高级函数,除此之外MATLAB还包含了一组低端的文件I/O函数,如前面介绍的所有文件的打开和关闭函数:
fopen函数和fclose函数。
这些函数是建立在ANSI标准C库中的I/O函数。
若用户对C语言熟悉的话,那么也肯定熟悉这些函数。
比如,MATLAB文件I/O函数使用和C语言同样的编程模式等。
要读写这些数据,需进行以下几步:
(1)使用fopen函数打开文件。
fopen函数将会返回一个文件标志,通过它,就可以使用其他所有的低端文件I/O函数。
(2)对文件进行操作,如:
读写二进制数据、格式化读写文本数据等。
(3)使用fclose函数来关闭文件。
2.4.1二进制数据的读取使用fread函数可从文件中读取二进制数据,它将每个字节看成整数,并将结果以矩阵形式返回。
对于读取二进制文件,fread必须制定正确的数据精度。
fread的基本调用方法是:
A=fread(fid)其中fid是一个整数型变量,是通过调用fopen函数获得的,表示要读取的文件标识符,输出变量A为矩阵,用于保存从文件中读取的数据。
例如文件test.txt的内容如下:
testit用fread函数读取该文件,输入如下命令:
>>f=fopen('test.txt','r');>>answer=fread(f)
answer=
11610111511632105116输出变量的内容是文件数据的ASCII码值,若要验证读入的数据是否正确,通过下面的命令可以验证。
>>disp(char(ans1'))testitfread函数的第二个输入参数可以控制返回矩阵的大小,例如:
>>f=fopen('test.txt','r');>>answer=fread(f,2)
answer=
116101也可以把返回矩阵定义为指定的矩阵格式,例如>>f=fopen('test.txt','r');>>an=fread(f,[23])
answer=
11611532101116105使用fread函数的第三个输入变量,可以控制fread将二进制数据转成MATLAB矩阵用的精度,包括一次读取的位数(NumberofBits)和这些位数所代表的数据类型。
常用的精确度类型有下列几种,如表2-6所示。
表2-6常见的精确度类型数据类型|说明|char|带符号的字符(通常是8h16)uchar|无符号的字符(通常是8bits)short|短整数(通常是16bits)long|长整数(通常是16bits)float|单精度浮点数(通常是32bits)double|双精度浮点数(通常是64bis)2.4.2二进制数据的写入使用fwrite函数可将矩阵按所指定的二进制格式写入文件,并返回成功写入文件的大小。
函数的调用方式如下:
count=fwrite(fid,A,precision)其中,count用来返回写入文件数据的大小,f参数同样是通过fopen函
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Matlab 各种 数据 读取 文件 读写 操作 汇总
![提示](https://static.bdocx.com/images/bang_tan.gif)