《MATLAB基礎(chǔ)與編程入門》課件第5章_第1頁
《MATLAB基礎(chǔ)與編程入門》課件第5章_第2頁
《MATLAB基礎(chǔ)與編程入門》課件第5章_第3頁
《MATLAB基礎(chǔ)與編程入門》課件第5章_第4頁
《MATLAB基礎(chǔ)與編程入門》課件第5章_第5頁
已閱讀5頁,還剩103頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第五章文件I/O5.1概述5.2高級(jí)例程5.3低級(jí)例程5.4文件導(dǎo)入向?qū)?.5本章小結(jié)5.1概述MATLAB提供了豐富的手段進(jìn)行數(shù)據(jù)文件的輸入、輸出。其中,MATLAB把從磁盤或者剪貼板獲取數(shù)據(jù)到MATLAB的工作空間的過程稱之為導(dǎo)入(Importing)數(shù)據(jù),把數(shù)據(jù)從MATLAB的工作空間中按照一定的格式保存到磁盤的過程稱之為導(dǎo)出(Exporting)數(shù)據(jù)。MATLAB導(dǎo)入數(shù)據(jù)支持的文件格式種類繁多,略加分類包含文本格式文件、二進(jìn)制格式文件以及其他標(biāo)準(zhǔn)格式文件。用戶需要根據(jù)不同的需要(導(dǎo)入數(shù)據(jù)還是導(dǎo)出數(shù)據(jù))以及文件的格式(文本或二進(jìn)制)選擇不同的文件I/O方式。MATLAB自己提供一種特殊的數(shù)據(jù)文件格式——MAT文件,這種文件是一種二進(jìn)制格式文件,擴(kuò)展名為.mat,它為MATLAB提供了跨平臺(tái)的數(shù)據(jù)交互能力。這些*.mat文件之所以能夠獨(dú)立于各種平臺(tái)的原因是在文件頭帶有設(shè)備的簽名,MATLAB在載入文件時(shí)將檢查這個(gè)簽名,如果發(fā)現(xiàn)文件來源不同于當(dāng)前的系統(tǒng),則進(jìn)行必要的轉(zhuǎn)換。目前MAT文件的版本為5,它的文件格式如圖5-1所示。圖5-1MAT文件格式

一般MAT文件分為兩個(gè)部分:文件頭部和數(shù)據(jù)。其中在文件的頭部主要包括一些描述性文字和相應(yīng)的版本與標(biāo)識(shí),這部分占用了128個(gè)字節(jié)。此后依次是保存在MAT文件中的數(shù)據(jù),數(shù)據(jù)是按照數(shù)據(jù)類型、數(shù)據(jù)長(zhǎng)度和數(shù)據(jù)三個(gè)部分保存的。

MAT文件不僅可以被MATLAB的函數(shù)加載,而且還能被C或者Fortran語言編寫的程序讀寫,MATLAB提供了相應(yīng)的API用于這些應(yīng)用程序的編寫。有關(guān)MAT文件的C/Fortran語言API參閱《MATLAB外部接口編程》一書。

相對(duì)于數(shù)據(jù)導(dǎo)出,數(shù)據(jù)文件的讀取往往是進(jìn)行文件I/O比較重要的環(huán)節(jié)。在MATLAB中進(jìn)行數(shù)據(jù)文件的導(dǎo)入有三種不同的途徑,分別是高級(jí)例程、低級(jí)例程和文件導(dǎo)入向?qū)?。其中,MATLAB的高級(jí)文件I/O例程分別針對(duì)不同的數(shù)據(jù)文件格式提供了不同的文件I/O函數(shù),這些函數(shù)能滿足大多數(shù)情況下數(shù)據(jù)導(dǎo)入和導(dǎo)出的需要。而低級(jí)文件I/O例程則為訪問任何一種類型文件的數(shù)據(jù)提供了接口,不過前提是編程人員必須知道文件的格式。否則讀取的結(jié)果是錯(cuò)誤的。文件的導(dǎo)入向?qū)枪?shù)據(jù)導(dǎo)入用的圖形界面,用于導(dǎo)入已知格式的文件和有一定規(guī)則的ASCII文本文件。5.2高級(jí)例程5.2.1一般數(shù)據(jù)文件操作如前文所示,MAT文件是MATLAB獨(dú)有的文件格式,提供了跨平臺(tái)的數(shù)據(jù)交換能力,也是MATLAB用戶最常用的數(shù)據(jù)文件格式。在MATLAB中,可以將當(dāng)前工作空間中的變量保存成MAT文件,也可以將MAT文件中的數(shù)據(jù)導(dǎo)入到MATLAB的工作空間中,這兩個(gè)過程分別使用save指令和load指令就可以完成。需要說明一點(diǎn),load和save指令不僅能夠加載和保存MAT格式的數(shù)據(jù)文件,而且還能夠加載一般的文本格式文件。但是在文本數(shù)據(jù)文件中不能包含特殊的文件間隔符。因此,將這兩個(gè)指令稱之為操作一般數(shù)據(jù)文件的指令。save指令能夠?qū)?dāng)前工作空間中的變量保存到指定的數(shù)據(jù)文件中,其基本語法為:

save:將當(dāng)前工作空間中所有的變量保存到matlab.mat文件中。

savefilenamevar1var2…:將當(dāng)前工作空間中的變量var1、var2等保存到指定文件中。

savefilenamedata*:功能同上,其中?*?為通配符。

savefilename:將當(dāng)前工作空間中所有的變量保存到指定的文件中。

save…option:按照option的不同取值保存數(shù)據(jù)。

save('filename',…):save指令的函數(shù)格式用法。

其中,option可以有如下幾種可能:

-append:在已有的數(shù)據(jù)文件尾部追加數(shù)據(jù)。

-ascii:保存為ASCII文本格式,數(shù)據(jù)按照八位精度保存。

-ascii-double:保存為ASCII文本格式,數(shù)據(jù)按照十六位精度保存。

-ascii-tabs:保存為ASCII文本格式,數(shù)據(jù)之間使用制表符作為間隔。

-ascii–double-tabs:上述幾種選項(xiàng)的結(jié)合。

-mat:保存為二進(jìn)制的MAT文件格式(默認(rèn))。

-v4:保存為MATLAB4或更早版本能夠識(shí)別的數(shù)據(jù)文件。

-v6:保存為MATLAB6或者5能夠識(shí)別的數(shù)據(jù)文件。

-v7:保存為MATLAB7能夠識(shí)別的數(shù)據(jù)文件,包含數(shù)據(jù)壓縮以及Unicode的使用。

-v7.3:在64bit平臺(tái)上保存海量數(shù)據(jù)(超過2GB)時(shí)使用。

注意:在國內(nèi),現(xiàn)在很少有用戶還在使用MATLAB4.x版本的產(chǎn)品,所以

-v4選項(xiàng)很少使用。若保存數(shù)據(jù)為文本格式,不指定間隔符為制表符,則數(shù)據(jù)之間使用空格作為數(shù)據(jù)之間的間隔。

load指令將數(shù)據(jù)文件的數(shù)據(jù)導(dǎo)入到MATLAB的工作空間,其基本的語法為:

load:將matlab.mat文件中所有變量加載到當(dāng)前的工作空間。

loadfilename:將指定文件中所有的變量加載到當(dāng)前的工作空間。

loadfilenamevar1var2…:

將指定文件中指定的變量加載到當(dāng)前工作空間。

loadfilename-ascii:將數(shù)據(jù)文件按照文本格式加載。

loadfilename-mat:將數(shù)據(jù)文件按照MAT文件格式加載。

S=load(…):load指令的函數(shù)格式用法。

注意:使用load指令加載數(shù)據(jù)文件時(shí),數(shù)據(jù)文件只要保存在MATLAB的搜索路徑上即可,同時(shí)若不指明數(shù)據(jù)文件的擴(kuò)展名,則數(shù)據(jù)文件默認(rèn)按照二進(jìn)制的MAT文件格式加載,否則都按照文本格式文件加載。這里結(jié)合具體的操作示例來說明save和load指令的使用方法?!纠?-1】save和load指令示例在MATLAB命令行窗體中鍵入下面的指令:>>clearall創(chuàng)建變量:>>x1=2;x2=3;x3=4;y1=0;保存數(shù)據(jù):>>savexdatax1x2查看當(dāng)前路徑下的MAT文件:>>what

MAT-filesinthecurrentdirectoryD:\Class\ML01

xdata將數(shù)據(jù)保存為ASCII格式文件:>>savexdata2.datx*-ascii>>clearall加載數(shù)據(jù)——默認(rèn)加載二進(jìn)制格式文件:>>loadxdata>>whosNameSizeBytesClassAttributesx11x18doublex21x18double加載ACSII格式的數(shù)據(jù):>>loadxdata2.dat>>whosNameSizeBytesClassAttributesx11x18doublex21x18doublexdata23x124double使用whos指令查看MAT數(shù)據(jù)文件:>>whos-filexdata.matNameSizeBytesClassAttributesx11x18doublex21x18double查看其他格式數(shù)據(jù)文件則會(huì)報(bào)錯(cuò):>>whos-filexdata2.dat???Errorusing==>whosCouldnotopenxdata2.datasavalidMAT-file.

例子5-1演示了使用save和load指令保存加載數(shù)據(jù)的基本過程。需要注意,保存數(shù)據(jù)文件時(shí)的通配符“*”的使用,在例子5-1的操作中,保存文本格式文件時(shí)使用了該通配符,于是MATLAB將所有以x開頭的變量保存了起來。另外,在加載文本格式的數(shù)據(jù)時(shí),將所有的數(shù)據(jù)保存在一個(gè)變量中。同樣,保存數(shù)據(jù)的時(shí)候,若不保存為二進(jìn)制格式的MAT文件,則最好指定數(shù)據(jù)文件的擴(kuò)展名。在使用save指令時(shí)需要注意,像上面示例所示的保存數(shù)據(jù)文件的方法每次都會(huì)新建一個(gè)新的數(shù)據(jù)文件,也就是說,在不指定特別的參數(shù)情況下,每次保存數(shù)據(jù)文件時(shí)都會(huì)將原有數(shù)據(jù)全部覆蓋。如果確實(shí)需要向已經(jīng)存在的數(shù)據(jù)文件中追加數(shù)據(jù),則需要使用

'-append'命令行參數(shù),例如在MATLAB命令行窗體中鍵入下面的指令:

>>x1=2;x2=3;x3=4;y1=0;>>savexdatax1x2>>whos-filexdata.matNameSizeBytesClassAttributesx11x18doublex21x18double再次向同一個(gè)數(shù)據(jù)文件中寫入數(shù)據(jù):>>savexdatax3>>whos-filexdata.matNameSizeBytesClassAttributesx31x18double數(shù)據(jù)文件被覆蓋,使用?'-append'?參數(shù):>>savexdatax1x2-append>>whos-filexdata.matNameSizeBytesClassAttributesx11x18doublex21x18doublex31x18double【例子5-2】save指令的數(shù)據(jù)壓縮能力在MATLAB命令行窗體中鍵入下面的指令:>>A=rand(100,100);>>whosNameSizeBytesClassAttributesA100x10080000double保存數(shù)據(jù)文件:>>savefile1A查看數(shù)據(jù)文件所占硬盤空間:>>!dirfile1.matVolumeindriveDisWorkspaceVolumeSerialNumberis1CF0-1D94

DirectoryofD:\Class\ML0104/22/200708:54PM75,855file1.mat1File(s)75,855bytes0Dir(s)19,943,968,768bytesfree保存成非壓縮格式:>>savefile2A-v6查看數(shù)據(jù)文件所占硬盤空間:>>!dirfile2.matVolumeindriveDisWorkspaceVolumeSerialNumberis1CF0-1D94

DirectoryofD:\Class\ML0104/22/200708:54PM80,184file2.mat1File(s)80,184bytes0Dir(s)19,943,886,848bytesfree

從上面的操作可以看到,在當(dāng)前的MATLAB版本下,默認(rèn)保存10?000個(gè)雙精度的數(shù)據(jù)所占用的硬盤空間為75?855個(gè)字節(jié),若不壓縮時(shí)(使用參數(shù)

-v6),則占用了80?184個(gè)字節(jié)。但是,如果讀者在使用MATLAB過程中,需要將自己的數(shù)據(jù)交給那些使用老版本MATLAB的用戶時(shí),一定要注意數(shù)據(jù)文件格式的轉(zhuǎn)換,否則,保存的數(shù)據(jù)文件是無法在早期MATLAB版本中加載的。如果確實(shí)不想使用MATLAB數(shù)據(jù)文件壓縮保存的特性,則可以通過MATLAB的Preferences對(duì)話框中相應(yīng)的設(shè)置來取消數(shù)據(jù)文件壓縮特性,如圖5-2所示。

圖5-2設(shè)置數(shù)據(jù)保存與早期MATLAB兼容

提示:

TheMathWorks公司推薦用戶在使用MATLAB的過程中盡量使用MAT文件保存用戶的數(shù)據(jù),這樣便于不同平臺(tái)下的用戶共享數(shù)據(jù)。另外,不同版本的MAT數(shù)據(jù)文件能夠保存的數(shù)據(jù)是不同的。

MATLAB4以及更早的版本僅僅支持二維雙精度數(shù)據(jù)、字符數(shù)組以及稀疏矩陣;MATLAB5.x以及6.x在MATLAB4的基礎(chǔ)之上增加了對(duì)多維數(shù)組、結(jié)構(gòu)以及元胞數(shù)組的支持;MATLAB7.0到MATLAB7.2增加了對(duì)數(shù)據(jù)壓縮以及Unicode的支持;在MATLAB7.3之后增加了對(duì)海量數(shù)據(jù)的支持。請(qǐng)讀者在使用MAT數(shù)據(jù)文件時(shí)要注意這些不同版本MATLAB之間的不同。

【例子5-3】save和load指令對(duì)結(jié)構(gòu)的操作在MATLAB命令行窗體中鍵入下面的指令:創(chuàng)建結(jié)構(gòu):>>S='Way';>>Student.age=26;>>Student.grade=uint16(1);

>>Student

Student=

name:'Way'

age:26 grade:1保存數(shù)據(jù),使用?-struct命令行參數(shù):

>>saveS.mat-structStudent

>>clear加載數(shù)據(jù):

>>loadS.mat

>>whos

NameSizeBytesClassAttributes

age???1x18double

grade1x12uint16

name1x36char可以看到,當(dāng)使用了?'-struct'?命令行參數(shù)之后,save指令將結(jié)構(gòu)的不同字段分別作為變量保存在了MAT數(shù)據(jù)文件中,如果不使用這個(gè)參數(shù),則保存的數(shù)據(jù)就是一個(gè)結(jié)構(gòu)對(duì)象。在使用load指令加載數(shù)據(jù)時(shí),則可以將特定的結(jié)構(gòu)字段加載進(jìn)來,其實(shí)也就是利用load指令將MAT數(shù)據(jù)文件中特定的變量進(jìn)行加載:>>clear>>loadS.matage>>whos

NameSizeBytesClassAttributes

age1x18double還可以利用save指令保存結(jié)構(gòu)中特定的字段:>>saveS1.mat-structStudent'age''name'>>clear>>whos-fileS1.matNameSizeBytesClassAttributesage 1x18double

name 1x36char注意:只能在保存結(jié)構(gòu)標(biāo)量對(duì)象時(shí),才能夠使用

'-struct'?命令行參數(shù),例如在MATLAB命令行窗體中,鍵入下面的指令:

>>Student=struct('name',{'Deni','Sherry'},'age',{22,24},'grade',{2,3})

Student=

1x2structarraywithfields:

name

age

grade保存數(shù)據(jù)文件:>>saveS.mat-structStudent???Errorusing==>saveTheargumentto-STRUCTmustbethenameofascalarstructurevariable.

5.2.2文本文件操作前面小節(jié)介紹的load和save指令只能用于讀寫簡(jiǎn)單格式的文本文件,在很多時(shí)候,數(shù)據(jù)文件的數(shù)據(jù)之間使用了特殊的間隔符,或者數(shù)據(jù)文件直接使用Excel電子表格形式進(jìn)行保存,這時(shí)save或者load指令就不能發(fā)揮作用了,于是,MATLAB提供了相應(yīng)的函數(shù)用來完成這些類型數(shù)據(jù)文件的讀寫工作。在表5-1中對(duì)常用數(shù)據(jù)文件的讀寫函數(shù)進(jìn)行了總結(jié)。表5-1常用數(shù)據(jù)文件的讀寫函數(shù)例子5-4有間隔符的文本讀寫。001 functiondelimiter_examp002 %DELIMITER_EXAMP003 %讀取具有不同間隔符號(hào)的文本數(shù)據(jù)文件004 %創(chuàng)建數(shù)據(jù)005 A=round(rand(2,5)*100);006 %將數(shù)據(jù)A保存到csvexamp.txt007 csvwrite('csvexamp.txt',A);008 %在從該文件中讀取數(shù)據(jù)009 B=dlmread('csvexamp.txt',',');010 %進(jìn)行數(shù)據(jù)處理......011 %將數(shù)據(jù)B保存到dlmexamp.txt,間隔符由用戶輸入012 c=input('輸入符號(hào)作為間隔符:','s');013 dlmwrite('dlmexamp.txt',B,c);014 disp('保存數(shù)據(jù)文件完畢!');015 %顯示文件的內(nèi)容016 disp('csvexamp.txt:')017 typecsvexamp.txt018 disp('dlmexamp.txt:')019 typedlmexamp.txt執(zhí)行例子5-2的代碼,在MATLAB命令行中鍵入:>>delimiter_examp輸入符號(hào)作為間隔符:Q保存數(shù)據(jù)文件完畢!csvexamp.txt:

56,67,31,92,9093,24,66,59,4

dlmexamp.txt:

56Q67Q31Q92Q9093Q24Q66Q59Q4

注意:在上面例子運(yùn)行過程中,輸入的間隔符Q后面有一個(gè)空格。例子5-2中使用了csvwrite、dlmread和dlmwrite函數(shù)進(jìn)行了文本文件的讀寫。在讀寫過程中,需要注意不同文件數(shù)據(jù)的間隔符號(hào)。csvread和csvwrite函數(shù)可以看作是dlmread和dlmwrite函數(shù)的特殊版本。在從文本文件中讀取數(shù)據(jù)的函數(shù)中,textread函數(shù)是一個(gè)比較特殊的函數(shù),它能夠按照用戶的需要從文本文件中讀取指定格式的數(shù)據(jù)。該函數(shù)能夠讀取的文本文件可以包含任何字符,同時(shí),制定格式的時(shí)候可以采用C語言中fscanf使用的格式化字符串。

[例子5-3]使用textread函數(shù)。假設(shè)在MATLAB的搜索路徑下有一個(gè)純文本文件包含了不同的信息,若須讀取該文件的內(nèi)容,可以在MATLAB命令行中鍵入下面的指令:>>typeseason.txtBroncos 1420.8750yFalcons 1420.8750yLions 5110.3125nPatriots 1510.9375yVikings 970.5625y>>[team,w,l,wp,playoff]=textread('season.txt','%s%d%d%f%c')team='Broncos''Falcons''Lions''Patriots''Vikings'w=14145159l=2

>>whosName SizeBytesClassl 5x140doublearrayplayoff 5x110chararrayteam 5x1368cellarrayw 5x140doublearraywp 5x140doublearray…5.2.3導(dǎo)入其他類型數(shù)據(jù)文件除了前面講述的幾種數(shù)據(jù)文件類型以外,MATLAB還能夠加載其他不同類型的數(shù)據(jù)文件,例如聲音、圖像等二進(jìn)制數(shù)據(jù)文件。MATLAB能夠讀入的二進(jìn)制文件類型以及相應(yīng)的加載函數(shù)信息可以通過在MATLAB中鍵入helpfileformats命令來獲取。在表5-2中總結(jié)了MATLAB能夠加載的常見的文件格式。

表5-2MATLAB能夠加載的數(shù)據(jù)文件

[例子5-6]讀取Excel電子表格文件的數(shù)據(jù)。在本例中使用的電子表格文件包含下列數(shù)據(jù):日期 數(shù)據(jù) 這里呢?1 11 2 12 3 13 4 14 5 15 6 16 7 NaN 8 Inf 9 19 那么在MATLAB中讀取該電子表格文件中的數(shù)據(jù):>>[a,b]=xlsread('xlsexamp.xls')a=NaNNaN1112123134145156167NaN8NaN919b='日期''數(shù)據(jù)''這里呢?'''''''''''''''''''''''''''''''''''''

'''NaN''''''inf'''

>>whos

NameSizeBytesClassAttributesa9x2144double

b9x31648cell

利用xlsread函數(shù)從電子表格中讀取數(shù)據(jù)時(shí),一般將所有數(shù)字量讀取出來放置在雙精度的數(shù)組中,當(dāng)單元格包含字符的時(shí)候,讀取的數(shù)據(jù)為NaN(例如讀取的數(shù)據(jù)a)。函數(shù)的第二個(gè)輸出是所有單元格包含的字符串,這些字符串組成一個(gè)元胞數(shù)組,例如讀取的數(shù)據(jù)b。在讀取數(shù)據(jù)的時(shí)候,需要注意Excel文件的版本,不是所有的Excel文件都能夠被MATLAB讀取的,特別是那些包含了特殊字符的文件。所以,xlsread函數(shù)僅僅能完成一些簡(jiǎn)單的數(shù)據(jù)讀取功能,比較復(fù)雜的電子表格讀取可以使用MATLAB產(chǎn)品家族中的ExcelLink工具箱。關(guān)于ExcelLink工具將在《MATLAB應(yīng)用程序集成與發(fā)布》一書中詳細(xì)介紹。

【例子5-7】importdata函數(shù)使用示例在當(dāng)前的目錄中有三個(gè)數(shù)據(jù)文件,其中一個(gè)是聲音文件train.wav,一個(gè)是圖像文件sample.jpg,另外一個(gè)為例子5-6中使用的Excel電子表格,這里統(tǒng)一使用importdata函數(shù)導(dǎo)入。在MATLAB命令行中鍵入下面的指令:

>>clearall導(dǎo)入聲音文件:

>>snd=importdata('train.wav');

>>whos

NameSizeBytesClassAttributes

snd1x1

103296struct將聲音播放出來:>>sound(snd.data,snd.fs)導(dǎo)入圖像文件:>>whosNameSizeBytesClassAttributes

img473x600x3 851400uint8

snd?1x1 103296struct在圖形窗體中顯示圖像:

>>image(img)導(dǎo)入Excel電子表格:

>>xls=importdata('xlsexamp.xls');

>>whosNameSizeBytesClassAttributes

img473x600x3851400uint8snd1x1

103296struct

xls?1x1

2288struct查看xls的內(nèi)容:>>xlsxls=

data:[1x1struct]

textdata:[1x1struct]這時(shí)導(dǎo)入的圖片文件顯示在MATLAB圖形窗體中,如圖5-3所示。

圖5-3加載圖片文件的顯示效果

【例子5-8】importdata函數(shù)源代碼清單片斷…case'wk1'[out.data,out.textdata]=wk1read(FileName);out=LocalRowColShuffle(out);case'avi'out=aviread(FileName);case'im'[out.cdata,out.colormap,out.alpha]=imread(FileName);case{'au','snd'}[out.data,out.fs]=auread(FileName);case'wav'[out.data,out.fs]=wavread(FileName);case'mat'…表5-3部分?jǐn)?shù)據(jù)文件的專用加載函數(shù)5.2.4導(dǎo)出二進(jìn)制格式數(shù)據(jù)

MATLAB除了能夠?qū)肭懊嫘」?jié)介紹的各種格式的數(shù)據(jù)文件外,還可以將工作空間的數(shù)據(jù)導(dǎo)出成不同格式的文件。這一過程不僅可以通過圖形用戶界面完成,還可以通過MATLAB函數(shù)來完成。不過,導(dǎo)出二進(jìn)制文件沒有統(tǒng)一的函數(shù)可以使用,不同格式的文件有不同的導(dǎo)出函數(shù),在表5-4中對(duì)部分函數(shù)進(jìn)行了總結(jié)。表5-4二進(jìn)制數(shù)據(jù)文件導(dǎo)出函數(shù)[例子5-7]導(dǎo)出數(shù)據(jù)為AVI文件。001 functionavi_examp002 %AVI_EXAMP導(dǎo)出數(shù)據(jù)為AVI格式003 004 %創(chuàng)建AVI文件對(duì)象005 aviobj=avifile('mymovie.avi','fps',5);006 %為AVI文件添加幀數(shù)據(jù)007 fork=1:25008 h=plot(fft(eye(k+16)));009 set(h,'EraseMode','xor');010 axisequal;011 %獲取當(dāng)前幀數(shù)據(jù)012 frame=getframe(gca);013 %添加幀數(shù)據(jù)到AVI文件015 aviobj=addframe(aviobj,frame);016 end017 %關(guān)閉AVI文件句柄018 aviobj=close(aviobj);在MATLAB命令行窗體中運(yùn)行該函數(shù),運(yùn)行過程中將連續(xù)繪制25個(gè)不同的圖像,運(yùn)行結(jié)束后,在當(dāng)前的路徑下將創(chuàng)建一個(gè)AVI文件——mymovie.avi??梢岳肳indowsMediaPlayer將文件播放出來。將MATLAB的數(shù)據(jù)導(dǎo)出為AVI文件的過程主要有三個(gè)步驟:

(1)

用avifile函數(shù)創(chuàng)建AVI文件的對(duì)象獲取文件的句柄。

(2)

通過addframe函數(shù)將必要的圖形文件按照每一幀添加到AVI文件中。(3)用close函數(shù)關(guān)閉AVI文件句柄。

5.3低級(jí)例程5.3.1打開關(guān)閉文件在進(jìn)行文件讀寫之前必須將需要讀寫的文件在MATLAB中打開。打開文件的函數(shù)為fopen,其命令行格式為

fid=fopen('filename','flag');其中,flag為控制文件讀寫的標(biāo)識(shí)符,它的取值可以為*r表示打開的文件進(jìn)行讀的操作。*w表示打開的文件進(jìn)行寫的操作,若文件不存在則創(chuàng)建新的文件。*a表示打開的文件進(jìn)行追加數(shù)據(jù)的操作,若文件不存在則創(chuàng)建新的文件。*r+表示打開的文件既可以進(jìn)行寫的操作,也可以進(jìn)行讀的操作。*w+表示打開的文件既可以進(jìn)行寫的操作,也可以進(jìn)行讀的操作,若文件不存在則創(chuàng)建新的文件。*a+表示打開的文件既可以進(jìn)行寫的操作、讀的操作,也可以進(jìn)行數(shù)據(jù)追加操作,若文件不存在則創(chuàng)建新的文件。

若能夠成功地打開文件,則fid為非負(fù)的整數(shù),否則為?1,而相應(yīng)的錯(cuò)誤信息,可以作為fopen函數(shù)的第二個(gè)輸出參數(shù)輸出到工作空間中。使用fopen函數(shù)的常見代碼段如下所示:001 fid=0;002 filename=input('Openfile:','s');003 [fid,message]=fopen(filename,'r');004 iffid==?1005 disp(message)006 end

這段代碼從命令行窗口中獲取一個(gè)文件名,然后用fopen函數(shù)打開它,若沒有成功,則將相應(yīng)的錯(cuò)誤信息顯示在命令行窗口中。關(guān)于fopen函數(shù)的詳細(xì)用法請(qǐng)參閱MATLAB的幫助文檔。關(guān)閉已經(jīng)打開的文件需要使用fclose函數(shù),其基本的命令格式為

status=fclose(fid)

關(guān)閉文件之后,fid變量依然存在于工作空間中,但是對(duì)fid再進(jìn)行文件I/O操作是錯(cuò)誤的。若函數(shù)運(yùn)行成功,則status為0,否則為-1。5.3.2讀寫數(shù)據(jù)

打開文件之后就要進(jìn)行文件內(nèi)容的讀寫了,MATLAB提供了兩大類低級(jí)文件I/O函數(shù)進(jìn)行文件內(nèi)容的讀寫——二進(jìn)制文件讀寫函數(shù)和文本文件讀寫函數(shù),在表5-5中對(duì)這些函數(shù)進(jìn)行了簡(jiǎn)要的總結(jié)。表5-5讀寫數(shù)據(jù)的低級(jí)I/O函數(shù)【例子5-10】格式化I/O示例001 function[data,count]=txtio_examp002 %TXTIO_EXAMP文本文件的格式化I/O003 004 %打開一個(gè)文本文件寫入數(shù)據(jù)005 [fidmsg]=fopen('square_mat.txt','wt');006 iffid==-1007 disp(msg);008 return;009 end010 %寫入數(shù)據(jù)

011 count=fprintf(fid,'%s\n','文本文件格式化I/O示例');012 count=fprintf(fid,'%i\t%i\t%i\n',[123;456;789]);013 %關(guān)閉文件014 fclose(fid);015 %打開文本文件讀入數(shù)據(jù)016 fid=fopen('square_mat.txt','rt');017 iffid==-1018 disp(msg);019 return;020 end021 %讀取數(shù)據(jù)022 title=fgetl(fid);023 disp(title);024 data=fscanf(fid,'%i');025 data=reshape(data,3,3);026 %關(guān)閉文件

027 fclose(fid);

在例子5-10展示了使用fscanf和fprintf進(jìn)行文件數(shù)據(jù)I/O的過程,這兩個(gè)函數(shù)使用起來和C語言的函數(shù)沒有太多區(qū)別,其格式化的文本和C語言的也保持一致,具體的請(qǐng)參閱C語言的說明或者M(jìn)ATLAB的幫助文檔。不過在MATLAB中使用這些函數(shù)充分利用了基于向量或者矩陣的運(yùn)算特點(diǎn),例如在例子5-10的012、024行進(jìn)行數(shù)據(jù)的寫入和讀取操作時(shí),若使用C語言完成同樣的工作則需要使用循環(huán)來處理,但是在MATLAB中僅僅用一行代碼就實(shí)現(xiàn)了同樣的工作。

運(yùn)行例子5-10,在MATLAB命令行中鍵入指令:>>[datacount]=txtio_examp文本文件格式化I/O示例:data=123456789count=18可以看出,在這里讀取的整數(shù)每個(gè)元素占用了2個(gè)字節(jié)。[例子5-11]

二進(jìn)制文件的讀寫。001 function[data,count,status]=binio_examp002 %BINIO_EXAMP二進(jìn)制文件讀寫示例003 004 %打開二進(jìn)制文件寫入數(shù)據(jù)005 fid=fopen('magic5.bin','wb');006 %寫入文本數(shù)據(jù)007 count=fwrite(fid,'喂,你好嗎?','int32');008 %寫入數(shù)據(jù)009 fwrite(fid,magic(5),'int32');010 %關(guān)閉文件011 status=fclose(fid);012 %打開二進(jìn)制文件讀取數(shù)據(jù)013 fid=fopen('magic5.bin','rb');014 %讀取文本015 S=fread(fid,count,'int32');016 disp(['讀取數(shù)據(jù)類型:',class(S)]);017 disp(['讀取數(shù)據(jù)內(nèi)容:',char(S')]);018 %讀取數(shù)據(jù)019 [datacount]=fread(fid,'int32');020 data=reshape(data,5,5);021 %關(guān)閉文件022 status=fclose(fid);

讀寫二進(jìn)制文件的時(shí)候略微麻煩一些,就是在讀寫數(shù)據(jù)的時(shí)候需要指定數(shù)據(jù)的類型和讀取數(shù)據(jù)的個(gè)數(shù)。例如在例子5-9的007、009行寫入數(shù)據(jù)時(shí),分別要指定寫入數(shù)據(jù)的類型,在015、019行讀入數(shù)據(jù)時(shí),需要指定讀取的數(shù)據(jù)類型和個(gè)數(shù),并且這些信息要同數(shù)據(jù)文件內(nèi)容保持一致,否則讀入的數(shù)據(jù)就不會(huì)正確。表5-6數(shù)據(jù)類型標(biāo)識(shí)符

由于在寫入二進(jìn)制文件數(shù)據(jù)時(shí)只能夠?qū)懭?位的字符數(shù)據(jù),所以在例子5-9寫入文本數(shù)據(jù)的時(shí)候沒有將文本數(shù)據(jù)按照字符類型寫入,而是按照32位整數(shù)的格式寫入的,也可以按照16位無符號(hào)整數(shù)類型寫入,所以在讀入數(shù)據(jù)時(shí)也按照32位整數(shù)的格式讀入。若在fread函數(shù)或者fwrite函數(shù)進(jìn)行操作的時(shí)候不指定數(shù)據(jù)類型標(biāo)識(shí)符,則默認(rèn)按照uchar的格式讀寫數(shù)據(jù)。運(yùn)行例子5-9的代碼,在MATLAB命令行中鍵入:>>[datacountstatus]=binio_examp讀取數(shù)據(jù)類型:double讀取數(shù)據(jù)內(nèi)容:喂,你好嗎?data=17241815235714164613202210121921311182529count=25status=0

除了在表5-6中總結(jié)的各種數(shù)據(jù)類型標(biāo)識(shí)符外,還可以使用C++語言的數(shù)據(jù)類型關(guān)鍵字來表示不同的數(shù)據(jù)類型,例如short、float、ushort、long等,只不過在使用這些關(guān)鍵字的時(shí)候,不同的操作系統(tǒng)平臺(tái)上可能同樣的數(shù)據(jù)類型占用的字節(jié)數(shù)不盡相同,所以,盡量不使用這些數(shù)據(jù)類型關(guān)鍵字進(jìn)行二進(jìn)制數(shù)據(jù)文件的I/O,具體的內(nèi)容介紹可以參閱C++語言手冊(cè)或者M(jìn)ATLAB的幫助文檔。5.3.3文件位置指針當(dāng)正確地打開文件并進(jìn)行數(shù)據(jù)的讀寫時(shí),MATLAB自動(dòng)創(chuàng)建一個(gè)文件位置指針來管理和維護(hù)文件讀寫數(shù)據(jù)的起始位置。所以,在進(jìn)行數(shù)據(jù)文件的讀寫時(shí),需要通過某種手段來控制和判斷當(dāng)前文件位置指針,例如判斷當(dāng)前文件位置指針是否已經(jīng)到達(dá)文件尾部,將文件位置指針移動(dòng)到指定的位置,獲取當(dāng)前文件位置指針在文件中的位置以及將文件位置指針重置在文件的頭部等。在MATLAB中,通過表5-7中的函數(shù)來控制、判斷文件位置指針。表5-7文件位置指針函數(shù)其中,fseek函數(shù)的命令行格式如下:

status=fseek(fid,offset,origin)

在命令行中,fid指已經(jīng)打開的數(shù)據(jù)文件,而offset是指移動(dòng)文件指針的偏移量,若數(shù)值為正則向文件尾部的方向移動(dòng)文件位置指針,若數(shù)值為0則不移動(dòng)文件位置指針,若數(shù)值為負(fù)則向文件頭部的方面移動(dòng)文件位置指針,offset的單位為字節(jié)數(shù)。origin為字符串,代表文件指針的位置,有效值為bof,表示文件的頭部,cof表示當(dāng)前的文件指針位置,eof表示文件的尾部。函數(shù)的返回值status若為0則表示操作成功,否則為?1。錯(cuò)誤的類型可以用ferror函數(shù)獲取。[例子5-12]

文件位置指針函數(shù)示例。001 function[pos,status]=pos_examp002 %POS_EXAMP文件位置指針示例003 004 %創(chuàng)建文件005 fid=fopen('testdata.dat','wb');006 x=1:10;007 fwrite(fid,x,'short');008 fclose(fid);009 %打開數(shù)據(jù)文件010 fid=fopen('testdata.dat','rb');011 %獲取當(dāng)前的文件指針位置012 pos=ftell(fid);013 disp(['當(dāng)前的文件位置指針:',num2str(pos)]);014 %向文件尾部移動(dòng)文件指針6個(gè)字節(jié)015 status=fseek(fid,6,'bof');016 %讀取數(shù)據(jù)017 four=fread(fid,1,'short');018 disp(['讀取的數(shù)據(jù):',num2str(four)]);019 %獲取當(dāng)前的文件指針020 pos=ftell(fid);021 disp(['當(dāng)前的文件位置指針:',num2str(pos)]);022 %從當(dāng)前的位置向文件頭部移動(dòng)指針4個(gè)字節(jié)023 status=fseek(fid,?4,'cof');024 %獲取當(dāng)前的文件指針025 pos=ftell(fid);026 disp(['當(dāng)前的文件位置指針:',num2str(pos)]);027 %讀取數(shù)據(jù)028 three=fread(fid,1,'short');029 disp(['讀取的數(shù)據(jù):',num2str(three)]);

例子5-12說明了數(shù)據(jù)文件位置指針移動(dòng)和獲取的各種方法。運(yùn)行例子5-10,在MATLAB命令行窗口中鍵入下面的指令:>>[pos,status]=pos_examp當(dāng)前的文件位置指針:0讀取的數(shù)據(jù):4當(dāng)前的文件位置指針:8

當(dāng)前的文件位置指針:4讀取的數(shù)據(jù):3pos=4status=0

從MATLABRelease14即MATLAB7.0開始,在文本文件格式化輸入操作函數(shù)中增加了一個(gè)新的函數(shù)textscan,用來替代textread函數(shù)和strread函數(shù),這個(gè)函數(shù)和textread函數(shù)之間的區(qū)別在于:

在使用textscan函數(shù)之前需要使用fopen函數(shù)將數(shù)據(jù)文件打開,讀取數(shù)據(jù)之后,要用fclose函數(shù)關(guān)閉數(shù)據(jù)文件。在性能方面,textscan函數(shù)要比textread函數(shù)好,如果讀取大量數(shù)據(jù)的話,最好使用textscan函數(shù)。

使用textscan函數(shù)可以從數(shù)據(jù)文件任意位置開始讀取數(shù)據(jù),而textread函數(shù)只能從數(shù)據(jù)文件的頭部順序讀取數(shù)據(jù)。

使用textscan函數(shù)時(shí),函數(shù)的參數(shù)個(gè)數(shù)不一定與讀取的數(shù)據(jù)完全匹配,而且textscan函數(shù)提供比textread函數(shù)更加靈活的讀取數(shù)據(jù)方式。

由于textscan函數(shù)有這樣一些特性,所以在使用textscan函數(shù)時(shí),往往需要一些低級(jí)例程的配合,例如打開數(shù)據(jù)文件需要使用fopen函數(shù),而關(guān)閉數(shù)據(jù)文件則需要fclose函數(shù),數(shù)據(jù)文件指針的定位需要fseek函數(shù)等。

【例子5-13】textscan函數(shù)的應(yīng)用這里依然使用例子5-5所使用的文本數(shù)據(jù)文件season.txt文件,該文件的內(nèi)容如下:

>>typeseason.txt

Broncos1420.8750y

Falcons1420.8750y

Lions5110.3125n

Patriots1510.9375y

Vikings970.5625y可以看到讀取的數(shù)據(jù)都保存到了相應(yīng)的元胞數(shù)組之中,此時(shí)可以重新定位文件指針,然后再來嘗試讀取數(shù)據(jù):

>>status=fseek(fid,17,'bof');>>[C,pos]=textscan(fid,'%f')C=

[0.8750]pos=25最后,別忘記關(guān)閉數(shù)據(jù)文件:

>>fclose(fid)可能在讀取少量數(shù)據(jù)的時(shí)候還是體現(xiàn)不出來使用textscan函數(shù)的優(yōu)勢(shì),如果讀取大量的數(shù)據(jù)則這個(gè)函數(shù)能夠獲取比較明顯的性能提升。讀者可以嘗試使用不同的方法讀取本章附帶示例當(dāng)中的數(shù)據(jù)文件

'DAQ500Hz.dat',該數(shù)據(jù)文件中總計(jì)有上萬行數(shù)據(jù),統(tǒng)計(jì)其讀取操作花費(fèi)的時(shí)間,在筆者的電腦上,利用importdata函數(shù)讀取數(shù)據(jù)需要花費(fèi)0.782?308秒,而利用textread函數(shù)需要花費(fèi)0.345?717秒,使用textscan函數(shù)時(shí),則僅需0.217?863秒。如果數(shù)據(jù)文件更大,則時(shí)間節(jié)約得更加明顯。

5.4文件導(dǎo)入向?qū)ATLAB為了便于用戶導(dǎo)入數(shù)據(jù)還提供了導(dǎo)入數(shù)據(jù)向?qū)?,?dǎo)入數(shù)據(jù)向?qū)且粋€(gè)圖形用戶界面,能夠幫助用戶導(dǎo)入各種類型的數(shù)據(jù),這樣,就不必通過編寫程序就可以把數(shù)據(jù)導(dǎo)入到MATLAB的工作空間。本小節(jié)通過具體的示例來講解導(dǎo)入數(shù)據(jù)向?qū)У氖褂梅椒?。[例?-11]通過數(shù)據(jù)導(dǎo)入向?qū)?dǎo)入文本數(shù)據(jù)文件。首先啟動(dòng)導(dǎo)入數(shù)據(jù)向?qū)?,啟?dòng)導(dǎo)入數(shù)據(jù)向?qū)в胁煌姆椒ǎ?通過菜單命令,執(zhí)行“File”菜單下的“ImportData”命令。*在MATLAB命令行中,鍵入指令uiimport。*執(zhí)行MATLAB的“Start”菜單中“MATLAB”子菜單下的“ImportWizard”命令。圖5-4啟動(dòng)數(shù)據(jù)導(dǎo)入向?qū)У某跏籍嬅?/p>

單擊“Browse”按鈕,在彈出的對(duì)話框中選擇需要加載的數(shù)據(jù)文件,單擊“打開”按鈕,對(duì)話框如圖5-5所示。圖5-5選擇需要加載的數(shù)據(jù)文件用鼠標(biāo)選擇需要打開的文件,然后單擊“打開”按鈕之后,數(shù)據(jù)導(dǎo)入向?qū)L試分析并加載數(shù)據(jù)文件,并且將能夠加載的數(shù)據(jù)顯示在圖形界面中,如圖5-6所示。

圖5-6加載了數(shù)據(jù)的數(shù)據(jù)導(dǎo)入對(duì)話框

在如圖5-5的對(duì)話框中可以通過data、textdata和colheaders標(biāo)簽頁查看導(dǎo)入的數(shù)據(jù),若導(dǎo)入正確無誤后,單擊Next按鈕,對(duì)話框?qū)⒁笥脩暨x擇數(shù)據(jù)的分隔符號(hào),如圖5-7所示。

圖5-7選擇不同的分隔符號(hào)

在對(duì)話框中可以直接設(shè)置的分隔符有逗號(hào)(Comma)、空格符(Space)、分號(hào)(Semicolon)、制表符(Tab)或者自定義(Other),當(dāng)選擇自定義(Other)方式時(shí),需要在相應(yīng)的文本輸入框中指定分隔符字符。不同的數(shù)據(jù)文件包含的數(shù)據(jù)分隔符不盡相同,所以不同的分隔符號(hào)在同樣的數(shù)據(jù)文件中導(dǎo)入的數(shù)據(jù)也不一樣。在這一步驟中一定要選擇合適的數(shù)據(jù)分隔符,之后單擊“Next”按鈕,對(duì)話框要求選擇不同的數(shù)據(jù)變量,如圖5-8所示。圖5-8選擇數(shù)據(jù)變量

選擇數(shù)據(jù)變量之后就可以單擊“Finish”按鈕完成整個(gè)數(shù)據(jù)導(dǎo)入的過程,這時(shí)在MATLAB的工作空間中,將出現(xiàn)剛才導(dǎo)入的兩個(gè)變量,在MATLAB中鍵入whos命令察看:>>whosNameSizeBytesClassAttributes

colheaders 1x13860celldata

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論