




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第五章文件I/O5.1概述5.2高級例程5.3低級例程5.4文件導入向導5.5本章小結5.1概述MATLAB提供了豐富的手段進行數據文件的輸入、輸出。其中,MATLAB把從磁盤或者剪貼板獲取數據到MATLAB的工作空間的過程稱之為導入(Importing)數據,把數據從MATLAB的工作空間中按照一定的格式保存到磁盤的過程稱之為導出(Exporting)數據。MATLAB導入數據支持的文件格式種類繁多,略加分類包含文本格式文件、二進制格式文件以及其他標準格式文件。用戶需要根據不同的需要(導入數據還是導出數據)以及文件的格式(文本或二進制)選擇不同的文件I/O方式。MATLAB自己提供一種特殊的數據文件格式——MAT文件,這種文件是一種二進制格式文件,擴展名為.mat,它為MATLAB提供了跨平臺的數據交互能力。這些*.mat文件之所以能夠獨立于各種平臺的原因是在文件頭帶有設備的簽名,MATLAB在載入文件時將檢查這個簽名,如果發(fā)現文件來源不同于當前的系統(tǒng),則進行必要的轉換。目前MAT文件的版本為5,它的文件格式如圖5-1所示。圖5-1MAT文件格式
一般MAT文件分為兩個部分:文件頭部和數據。其中在文件的頭部主要包括一些描述性文字和相應的版本與標識,這部分占用了128個字節(jié)。此后依次是保存在MAT文件中的數據,數據是按照數據類型、數據長度和數據三個部分保存的。
MAT文件不僅可以被MATLAB的函數加載,而且還能被C或者Fortran語言編寫的程序讀寫,MATLAB提供了相應的API用于這些應用程序的編寫。有關MAT文件的C/Fortran語言API參閱《MATLAB外部接口編程》一書。
相對于數據導出,數據文件的讀取往往是進行文件I/O比較重要的環(huán)節(jié)。在MATLAB中進行數據文件的導入有三種不同的途徑,分別是高級例程、低級例程和文件導入向導。其中,MATLAB的高級文件I/O例程分別針對不同的數據文件格式提供了不同的文件I/O函數,這些函數能滿足大多數情況下數據導入和導出的需要。而低級文件I/O例程則為訪問任何一種類型文件的數據提供了接口,不過前提是編程人員必須知道文件的格式。否則讀取的結果是錯誤的。文件的導入向導是供數據導入用的圖形界面,用于導入已知格式的文件和有一定規(guī)則的ASCII文本文件。5.2高級例程5.2.1一般數據文件操作如前文所示,MAT文件是MATLAB獨有的文件格式,提供了跨平臺的數據交換能力,也是MATLAB用戶最常用的數據文件格式。在MATLAB中,可以將當前工作空間中的變量保存成MAT文件,也可以將MAT文件中的數據導入到MATLAB的工作空間中,這兩個過程分別使用save指令和load指令就可以完成。需要說明一點,load和save指令不僅能夠加載和保存MAT格式的數據文件,而且還能夠加載一般的文本格式文件。但是在文本數據文件中不能包含特殊的文件間隔符。因此,將這兩個指令稱之為操作一般數據文件的指令。save指令能夠將當前工作空間中的變量保存到指定的數據文件中,其基本語法為:
save:將當前工作空間中所有的變量保存到matlab.mat文件中。
savefilenamevar1var2…:將當前工作空間中的變量var1、var2等保存到指定文件中。
savefilenamedata*:功能同上,其中?*?為通配符。
savefilename:將當前工作空間中所有的變量保存到指定的文件中。
save…option:按照option的不同取值保存數據。
save('filename',…):save指令的函數格式用法。
其中,option可以有如下幾種可能:
-append:在已有的數據文件尾部追加數據。
-ascii:保存為ASCII文本格式,數據按照八位精度保存。
-ascii-double:保存為ASCII文本格式,數據按照十六位精度保存。
-ascii-tabs:保存為ASCII文本格式,數據之間使用制表符作為間隔。
-ascii–double-tabs:上述幾種選項的結合。
-mat:保存為二進制的MAT文件格式(默認)。
-v4:保存為MATLAB4或更早版本能夠識別的數據文件。
-v6:保存為MATLAB6或者5能夠識別的數據文件。
-v7:保存為MATLAB7能夠識別的數據文件,包含數據壓縮以及Unicode的使用。
-v7.3:在64bit平臺上保存海量數據(超過2GB)時使用。
注意:在國內,現在很少有用戶還在使用MATLAB4.x版本的產品,所以
-v4選項很少使用。若保存數據為文本格式,不指定間隔符為制表符,則數據之間使用空格作為數據之間的間隔。
load指令將數據文件的數據導入到MATLAB的工作空間,其基本的語法為:
load:將matlab.mat文件中所有變量加載到當前的工作空間。
loadfilename:將指定文件中所有的變量加載到當前的工作空間。
loadfilenamevar1var2…:
將指定文件中指定的變量加載到當前工作空間。
loadfilename-ascii:將數據文件按照文本格式加載。
loadfilename-mat:將數據文件按照MAT文件格式加載。
S=load(…):load指令的函數格式用法。
注意:使用load指令加載數據文件時,數據文件只要保存在MATLAB的搜索路徑上即可,同時若不指明數據文件的擴展名,則數據文件默認按照二進制的MAT文件格式加載,否則都按照文本格式文件加載。這里結合具體的操作示例來說明save和load指令的使用方法。【例子5-1】save和load指令示例在MATLAB命令行窗體中鍵入下面的指令:>>clearall創(chuàng)建變量:>>x1=2;x2=3;x3=4;y1=0;保存數據:>>savexdatax1x2查看當前路徑下的MAT文件:>>what
MAT-filesinthecurrentdirectoryD:\Class\ML01
xdata將數據保存為ASCII格式文件:>>savexdata2.datx*-ascii>>clearall加載數據——默認加載二進制格式文件:>>loadxdata>>whosNameSizeBytesClassAttributesx11x18doublex21x18double加載ACSII格式的數據:>>loadxdata2.dat>>whosNameSizeBytesClassAttributesx11x18doublex21x18doublexdata23x124double使用whos指令查看MAT數據文件:>>whos-filexdata.matNameSizeBytesClassAttributesx11x18doublex21x18double查看其他格式數據文件則會報錯:>>whos-filexdata2.dat???Errorusing==>whosCouldnotopenxdata2.datasavalidMAT-file.
例子5-1演示了使用save和load指令保存加載數據的基本過程。需要注意,保存數據文件時的通配符“*”的使用,在例子5-1的操作中,保存文本格式文件時使用了該通配符,于是MATLAB將所有以x開頭的變量保存了起來。另外,在加載文本格式的數據時,將所有的數據保存在一個變量中。同樣,保存數據的時候,若不保存為二進制格式的MAT文件,則最好指定數據文件的擴展名。在使用save指令時需要注意,像上面示例所示的保存數據文件的方法每次都會新建一個新的數據文件,也就是說,在不指定特別的參數情況下,每次保存數據文件時都會將原有數據全部覆蓋。如果確實需要向已經存在的數據文件中追加數據,則需要使用
'-append'命令行參數,例如在MATLAB命令行窗體中鍵入下面的指令:
>>x1=2;x2=3;x3=4;y1=0;>>savexdatax1x2>>whos-filexdata.matNameSizeBytesClassAttributesx11x18doublex21x18double再次向同一個數據文件中寫入數據:>>savexdatax3>>whos-filexdata.matNameSizeBytesClassAttributesx31x18double數據文件被覆蓋,使用?'-append'?參數:>>savexdatax1x2-append>>whos-filexdata.matNameSizeBytesClassAttributesx11x18doublex21x18doublex31x18double【例子5-2】save指令的數據壓縮能力在MATLAB命令行窗體中鍵入下面的指令:>>A=rand(100,100);>>whosNameSizeBytesClassAttributesA100x10080000double保存數據文件:>>savefile1A查看數據文件所占硬盤空間:>>!dirfile1.matVolumeindriveDisWorkspaceVolumeSerialNumberis1CF0-1D94
DirectoryofD:\Class\ML0104/22/200708:54PM75,855file1.mat1File(s)75,855bytes0Dir(s)19,943,968,768bytesfree保存成非壓縮格式:>>savefile2A-v6查看數據文件所占硬盤空間:>>!dirfile2.matVolumeindriveDisWorkspaceVolumeSerialNumberis1CF0-1D94
DirectoryofD:\Class\ML0104/22/200708:54PM80,184file2.mat1File(s)80,184bytes0Dir(s)19,943,886,848bytesfree
從上面的操作可以看到,在當前的MATLAB版本下,默認保存10?000個雙精度的數據所占用的硬盤空間為75?855個字節(jié),若不壓縮時(使用參數
-v6),則占用了80?184個字節(jié)。但是,如果讀者在使用MATLAB過程中,需要將自己的數據交給那些使用老版本MATLAB的用戶時,一定要注意數據文件格式的轉換,否則,保存的數據文件是無法在早期MATLAB版本中加載的。如果確實不想使用MATLAB數據文件壓縮保存的特性,則可以通過MATLAB的Preferences對話框中相應的設置來取消數據文件壓縮特性,如圖5-2所示。
圖5-2設置數據保存與早期MATLAB兼容
提示:
TheMathWorks公司推薦用戶在使用MATLAB的過程中盡量使用MAT文件保存用戶的數據,這樣便于不同平臺下的用戶共享數據。另外,不同版本的MAT數據文件能夠保存的數據是不同的。
MATLAB4以及更早的版本僅僅支持二維雙精度數據、字符數組以及稀疏矩陣;MATLAB5.x以及6.x在MATLAB4的基礎之上增加了對多維數組、結構以及元胞數組的支持;MATLAB7.0到MATLAB7.2增加了對數據壓縮以及Unicode的支持;在MATLAB7.3之后增加了對海量數據的支持。請讀者在使用MAT數據文件時要注意這些不同版本MATLAB之間的不同。
【例子5-3】save和load指令對結構的操作在MATLAB命令行窗體中鍵入下面的指令:創(chuàng)建結構:>>S='Way';>>Student.age=26;>>Student.grade=uint16(1);
>>Student
Student=
name:'Way'
age:26 grade:1保存數據,使用?-struct命令行參數:
>>saveS.mat-structStudent
>>clear加載數據:
>>loadS.mat
>>whos
NameSizeBytesClassAttributes
age???1x18double
grade1x12uint16
name1x36char可以看到,當使用了?'-struct'?命令行參數之后,save指令將結構的不同字段分別作為變量保存在了MAT數據文件中,如果不使用這個參數,則保存的數據就是一個結構對象。在使用load指令加載數據時,則可以將特定的結構字段加載進來,其實也就是利用load指令將MAT數據文件中特定的變量進行加載:>>clear>>loadS.matage>>whos
NameSizeBytesClassAttributes
age1x18double還可以利用save指令保存結構中特定的字段:>>saveS1.mat-structStudent'age''name'>>clear>>whos-fileS1.matNameSizeBytesClassAttributesage 1x18double
name 1x36char注意:只能在保存結構標量對象時,才能夠使用
'-struct'?命令行參數,例如在MATLAB命令行窗體中,鍵入下面的指令:
>>Student=struct('name',{'Deni','Sherry'},'age',{22,24},'grade',{2,3})
Student=
1x2structarraywithfields:
name
age
grade保存數據文件:>>saveS.mat-structStudent???Errorusing==>saveTheargumentto-STRUCTmustbethenameofascalarstructurevariable.
5.2.2文本文件操作前面小節(jié)介紹的load和save指令只能用于讀寫簡單格式的文本文件,在很多時候,數據文件的數據之間使用了特殊的間隔符,或者數據文件直接使用Excel電子表格形式進行保存,這時save或者load指令就不能發(fā)揮作用了,于是,MATLAB提供了相應的函數用來完成這些類型數據文件的讀寫工作。在表5-1中對常用數據文件的讀寫函數進行了總結。表5-1常用數據文件的讀寫函數例子5-4有間隔符的文本讀寫。001 functiondelimiter_examp002 %DELIMITER_EXAMP003 %讀取具有不同間隔符號的文本數據文件004 %創(chuàng)建數據005 A=round(rand(2,5)*100);006 %將數據A保存到csvexamp.txt007 csvwrite('csvexamp.txt',A);008 %在從該文件中讀取數據009 B=dlmread('csvexamp.txt',',');010 %進行數據處理......011 %將數據B保存到dlmexamp.txt,間隔符由用戶輸入012 c=input('輸入符號作為間隔符:','s');013 dlmwrite('dlmexamp.txt',B,c);014 disp('保存數據文件完畢!');015 %顯示文件的內容016 disp('csvexamp.txt:')017 typecsvexamp.txt018 disp('dlmexamp.txt:')019 typedlmexamp.txt執(zhí)行例子5-2的代碼,在MATLAB命令行中鍵入:>>delimiter_examp輸入符號作為間隔符:Q保存數據文件完畢!csvexamp.txt:
56,67,31,92,9093,24,66,59,4
dlmexamp.txt:
56Q67Q31Q92Q9093Q24Q66Q59Q4
注意:在上面例子運行過程中,輸入的間隔符Q后面有一個空格。例子5-2中使用了csvwrite、dlmread和dlmwrite函數進行了文本文件的讀寫。在讀寫過程中,需要注意不同文件數據的間隔符號。csvread和csvwrite函數可以看作是dlmread和dlmwrite函數的特殊版本。在從文本文件中讀取數據的函數中,textread函數是一個比較特殊的函數,它能夠按照用戶的需要從文本文件中讀取指定格式的數據。該函數能夠讀取的文本文件可以包含任何字符,同時,制定格式的時候可以采用C語言中fscanf使用的格式化字符串。
[例子5-3]使用textread函數。假設在MATLAB的搜索路徑下有一個純文本文件包含了不同的信息,若須讀取該文件的內容,可以在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導入其他類型數據文件除了前面講述的幾種數據文件類型以外,MATLAB還能夠加載其他不同類型的數據文件,例如聲音、圖像等二進制數據文件。MATLAB能夠讀入的二進制文件類型以及相應的加載函數信息可以通過在MATLAB中鍵入helpfileformats命令來獲取。在表5-2中總結了MATLAB能夠加載的常見的文件格式。
表5-2MATLAB能夠加載的數據文件
[例子5-6]讀取Excel電子表格文件的數據。在本例中使用的電子表格文件包含下列數據:日期 數據 這里呢?1 11 2 12 3 13 4 14 5 15 6 16 7 NaN 8 Inf 9 19 那么在MATLAB中讀取該電子表格文件中的數據:>>[a,b]=xlsread('xlsexamp.xls')a=NaNNaN1112123134145156167NaN8NaN919b='日期''數據''這里呢?'''''''''''''''''''''''''''''''''''''
'''NaN''''''inf'''
>>whos
NameSizeBytesClassAttributesa9x2144double
b9x31648cell
利用xlsread函數從電子表格中讀取數據時,一般將所有數字量讀取出來放置在雙精度的數組中,當單元格包含字符的時候,讀取的數據為NaN(例如讀取的數據a)。函數的第二個輸出是所有單元格包含的字符串,這些字符串組成一個元胞數組,例如讀取的數據b。在讀取數據的時候,需要注意Excel文件的版本,不是所有的Excel文件都能夠被MATLAB讀取的,特別是那些包含了特殊字符的文件。所以,xlsread函數僅僅能完成一些簡單的數據讀取功能,比較復雜的電子表格讀取可以使用MATLAB產品家族中的ExcelLink工具箱。關于ExcelLink工具將在《MATLAB應用程序集成與發(fā)布》一書中詳細介紹。
【例子5-7】importdata函數使用示例在當前的目錄中有三個數據文件,其中一個是聲音文件train.wav,一個是圖像文件sample.jpg,另外一個為例子5-6中使用的Excel電子表格,這里統(tǒng)一使用importdata函數導入。在MATLAB命令行中鍵入下面的指令:
>>clearall導入聲音文件:
>>snd=importdata('train.wav');
>>whos
NameSizeBytesClassAttributes
snd1x1
103296struct將聲音播放出來:>>sound(snd.data,snd.fs)導入圖像文件:>>whosNameSizeBytesClassAttributes
img473x600x3 851400uint8
snd?1x1 103296struct在圖形窗體中顯示圖像:
>>image(img)導入Excel電子表格:
>>xls=importdata('xlsexamp.xls');
>>whosNameSizeBytesClassAttributes
img473x600x3851400uint8snd1x1
103296struct
xls?1x1
2288struct查看xls的內容:>>xlsxls=
data:[1x1struct]
textdata:[1x1struct]這時導入的圖片文件顯示在MATLAB圖形窗體中,如圖5-3所示。
圖5-3加載圖片文件的顯示效果
【例子5-8】importdata函數源代碼清單片斷…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部分數據文件的專用加載函數5.2.4導出二進制格式數據
MATLAB除了能夠導入前面小節(jié)介紹的各種格式的數據文件外,還可以將工作空間的數據導出成不同格式的文件。這一過程不僅可以通過圖形用戶界面完成,還可以通過MATLAB函數來完成。不過,導出二進制文件沒有統(tǒng)一的函數可以使用,不同格式的文件有不同的導出函數,在表5-4中對部分函數進行了總結。表5-4二進制數據文件導出函數[例子5-7]導出數據為AVI文件。001 functionavi_examp002 %AVI_EXAMP導出數據為AVI格式003 004 %創(chuàng)建AVI文件對象005 aviobj=avifile('mymovie.avi','fps',5);006 %為AVI文件添加幀數據007 fork=1:25008 h=plot(fft(eye(k+16)));009 set(h,'EraseMode','xor');010 axisequal;011 %獲取當前幀數據012 frame=getframe(gca);013 %添加幀數據到AVI文件015 aviobj=addframe(aviobj,frame);016 end017 %關閉AVI文件句柄018 aviobj=close(aviobj);在MATLAB命令行窗體中運行該函數,運行過程中將連續(xù)繪制25個不同的圖像,運行結束后,在當前的路徑下將創(chuàng)建一個AVI文件——mymovie.avi??梢岳肳indowsMediaPlayer將文件播放出來。將MATLAB的數據導出為AVI文件的過程主要有三個步驟:
(1)
用avifile函數創(chuàng)建AVI文件的對象獲取文件的句柄。
(2)
通過addframe函數將必要的圖形文件按照每一幀添加到AVI文件中。(3)用close函數關閉AVI文件句柄。
5.3低級例程5.3.1打開關閉文件在進行文件讀寫之前必須將需要讀寫的文件在MATLAB中打開。打開文件的函數為fopen,其命令行格式為
fid=fopen('filename','flag');其中,flag為控制文件讀寫的標識符,它的取值可以為*r表示打開的文件進行讀的操作。*w表示打開的文件進行寫的操作,若文件不存在則創(chuàng)建新的文件。*a表示打開的文件進行追加數據的操作,若文件不存在則創(chuàng)建新的文件。*r+表示打開的文件既可以進行寫的操作,也可以進行讀的操作。*w+表示打開的文件既可以進行寫的操作,也可以進行讀的操作,若文件不存在則創(chuàng)建新的文件。*a+表示打開的文件既可以進行寫的操作、讀的操作,也可以進行數據追加操作,若文件不存在則創(chuàng)建新的文件。
若能夠成功地打開文件,則fid為非負的整數,否則為?1,而相應的錯誤信息,可以作為fopen函數的第二個輸出參數輸出到工作空間中。使用fopen函數的常見代碼段如下所示:001 fid=0;002 filename=input('Openfile:','s');003 [fid,message]=fopen(filename,'r');004 iffid==?1005 disp(message)006 end
這段代碼從命令行窗口中獲取一個文件名,然后用fopen函數打開它,若沒有成功,則將相應的錯誤信息顯示在命令行窗口中。關于fopen函數的詳細用法請參閱MATLAB的幫助文檔。關閉已經打開的文件需要使用fclose函數,其基本的命令格式為
status=fclose(fid)
關閉文件之后,fid變量依然存在于工作空間中,但是對fid再進行文件I/O操作是錯誤的。若函數運行成功,則status為0,否則為-1。5.3.2讀寫數據
打開文件之后就要進行文件內容的讀寫了,MATLAB提供了兩大類低級文件I/O函數進行文件內容的讀寫——二進制文件讀寫函數和文本文件讀寫函數,在表5-5中對這些函數進行了簡要的總結。表5-5讀寫數據的低級I/O函數【例子5-10】格式化I/O示例001 function[data,count]=txtio_examp002 %TXTIO_EXAMP文本文件的格式化I/O003 004 %打開一個文本文件寫入數據005 [fidmsg]=fopen('square_mat.txt','wt');006 iffid==-1007 disp(msg);008 return;009 end010 %寫入數據
011 count=fprintf(fid,'%s\n','文本文件格式化I/O示例');012 count=fprintf(fid,'%i\t%i\t%i\n',[123;456;789]);013 %關閉文件014 fclose(fid);015 %打開文本文件讀入數據016 fid=fopen('square_mat.txt','rt');017 iffid==-1018 disp(msg);019 return;020 end021 %讀取數據022 title=fgetl(fid);023 disp(title);024 data=fscanf(fid,'%i');025 data=reshape(data,3,3);026 %關閉文件
027 fclose(fid);
在例子5-10展示了使用fscanf和fprintf進行文件數據I/O的過程,這兩個函數使用起來和C語言的函數沒有太多區(qū)別,其格式化的文本和C語言的也保持一致,具體的請參閱C語言的說明或者MATLAB的幫助文檔。不過在MATLAB中使用這些函數充分利用了基于向量或者矩陣的運算特點,例如在例子5-10的012、024行進行數據的寫入和讀取操作時,若使用C語言完成同樣的工作則需要使用循環(huán)來處理,但是在MATLAB中僅僅用一行代碼就實現了同樣的工作。
運行例子5-10,在MATLAB命令行中鍵入指令:>>[datacount]=txtio_examp文本文件格式化I/O示例:data=123456789count=18可以看出,在這里讀取的整數每個元素占用了2個字節(jié)。[例子5-11]
二進制文件的讀寫。001 function[data,count,status]=binio_examp002 %BINIO_EXAMP二進制文件讀寫示例003 004 %打開二進制文件寫入數據005 fid=fopen('magic5.bin','wb');006 %寫入文本數據007 count=fwrite(fid,'喂,你好嗎?','int32');008 %寫入數據009 fwrite(fid,magic(5),'int32');010 %關閉文件011 status=fclose(fid);012 %打開二進制文件讀取數據013 fid=fopen('magic5.bin','rb');014 %讀取文本015 S=fread(fid,count,'int32');016 disp(['讀取數據類型:',class(S)]);017 disp(['讀取數據內容:',char(S')]);018 %讀取數據019 [datacount]=fread(fid,'int32');020 data=reshape(data,5,5);021 %關閉文件022 status=fclose(fid);
讀寫二進制文件的時候略微麻煩一些,就是在讀寫數據的時候需要指定數據的類型和讀取數據的個數。例如在例子5-9的007、009行寫入數據時,分別要指定寫入數據的類型,在015、019行讀入數據時,需要指定讀取的數據類型和個數,并且這些信息要同數據文件內容保持一致,否則讀入的數據就不會正確。表5-6數據類型標識符
由于在寫入二進制文件數據時只能夠寫入8位的字符數據,所以在例子5-9寫入文本數據的時候沒有將文本數據按照字符類型寫入,而是按照32位整數的格式寫入的,也可以按照16位無符號整數類型寫入,所以在讀入數據時也按照32位整數的格式讀入。若在fread函數或者fwrite函數進行操作的時候不指定數據類型標識符,則默認按照uchar的格式讀寫數據。運行例子5-9的代碼,在MATLAB命令行中鍵入:>>[datacountstatus]=binio_examp讀取數據類型:double讀取數據內容:喂,你好嗎?data=17241815235714164613202210121921311182529count=25status=0
除了在表5-6中總結的各種數據類型標識符外,還可以使用C++語言的數據類型關鍵字來表示不同的數據類型,例如short、float、ushort、long等,只不過在使用這些關鍵字的時候,不同的操作系統(tǒng)平臺上可能同樣的數據類型占用的字節(jié)數不盡相同,所以,盡量不使用這些數據類型關鍵字進行二進制數據文件的I/O,具體的內容介紹可以參閱C++語言手冊或者MATLAB的幫助文檔。5.3.3文件位置指針當正確地打開文件并進行數據的讀寫時,MATLAB自動創(chuàng)建一個文件位置指針來管理和維護文件讀寫數據的起始位置。所以,在進行數據文件的讀寫時,需要通過某種手段來控制和判斷當前文件位置指針,例如判斷當前文件位置指針是否已經到達文件尾部,將文件位置指針移動到指定的位置,獲取當前文件位置指針在文件中的位置以及將文件位置指針重置在文件的頭部等。在MATLAB中,通過表5-7中的函數來控制、判斷文件位置指針。表5-7文件位置指針函數其中,fseek函數的命令行格式如下:
status=fseek(fid,offset,origin)
在命令行中,fid指已經打開的數據文件,而offset是指移動文件指針的偏移量,若數值為正則向文件尾部的方向移動文件位置指針,若數值為0則不移動文件位置指針,若數值為負則向文件頭部的方面移動文件位置指針,offset的單位為字節(jié)數。origin為字符串,代表文件指針的位置,有效值為bof,表示文件的頭部,cof表示當前的文件指針位置,eof表示文件的尾部。函數的返回值status若為0則表示操作成功,否則為?1。錯誤的類型可以用ferror函數獲取。[例子5-12]
文件位置指針函數示例。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 %打開數據文件010 fid=fopen('testdata.dat','rb');011 %獲取當前的文件指針位置012 pos=ftell(fid);013 disp(['當前的文件位置指針:',num2str(pos)]);014 %向文件尾部移動文件指針6個字節(jié)015 status=fseek(fid,6,'bof');016 %讀取數據017 four=fread(fid,1,'short');018 disp(['讀取的數據:',num2str(four)]);019 %獲取當前的文件指針020 pos=ftell(fid);021 disp(['當前的文件位置指針:',num2str(pos)]);022 %從當前的位置向文件頭部移動指針4個字節(jié)023 status=fseek(fid,?4,'cof');024 %獲取當前的文件指針025 pos=ftell(fid);026 disp(['當前的文件位置指針:',num2str(pos)]);027 %讀取數據028 three=fread(fid,1,'short');029 disp(['讀取的數據:',num2str(three)]);
例子5-12說明了數據文件位置指針移動和獲取的各種方法。運行例子5-10,在MATLAB命令行窗口中鍵入下面的指令:>>[pos,status]=pos_examp當前的文件位置指針:0讀取的數據:4當前的文件位置指針:8
當前的文件位置指針:4讀取的數據:3pos=4status=0
從MATLABRelease14即MATLAB7.0開始,在文本文件格式化輸入操作函數中增加了一個新的函數textscan,用來替代textread函數和strread函數,這個函數和textread函數之間的區(qū)別在于:
在使用textscan函數之前需要使用fopen函數將數據文件打開,讀取數據之后,要用fclose函數關閉數據文件。在性能方面,textscan函數要比textread函數好,如果讀取大量數據的話,最好使用textscan函數。
使用textscan函數可以從數據文件任意位置開始讀取數據,而textread函數只能從數據文件的頭部順序讀取數據。
使用textscan函數時,函數的參數個數不一定與讀取的數據完全匹配,而且textscan函數提供比textread函數更加靈活的讀取數據方式。
由于textscan函數有這樣一些特性,所以在使用textscan函數時,往往需要一些低級例程的配合,例如打開數據文件需要使用fopen函數,而關閉數據文件則需要fclose函數,數據文件指針的定位需要fseek函數等。
【例子5-13】textscan函數的應用這里依然使用例子5-5所使用的文本數據文件season.txt文件,該文件的內容如下:
>>typeseason.txt
Broncos1420.8750y
Falcons1420.8750y
Lions5110.3125n
Patriots1510.9375y
Vikings970.5625y可以看到讀取的數據都保存到了相應的元胞數組之中,此時可以重新定位文件指針,然后再來嘗試讀取數據:
>>status=fseek(fid,17,'bof');>>[C,pos]=textscan(fid,'%f')C=
[0.8750]pos=25最后,別忘記關閉數據文件:
>>fclose(fid)可能在讀取少量數據的時候還是體現不出來使用textscan函數的優(yōu)勢,如果讀取大量的數據則這個函數能夠獲取比較明顯的性能提升。讀者可以嘗試使用不同的方法讀取本章附帶示例當中的數據文件
'DAQ500Hz.dat',該數據文件中總計有上萬行數據,統(tǒng)計其讀取操作花費的時間,在筆者的電腦上,利用importdata函數讀取數據需要花費0.782?308秒,而利用textread函數需要花費0.345?717秒,使用textscan函數時,則僅需0.217?863秒。如果數據文件更大,則時間節(jié)約得更加明顯。
5.4文件導入向導MATLAB為了便于用戶導入數據還提供了導入數據向導,導入數據向導是一個圖形用戶界面,能夠幫助用戶導入各種類型的數據,這樣,就不必通過編寫程序就可以把數據導入到MATLAB的工作空間。本小節(jié)通過具體的示例來講解導入數據向導的使用方法。[例子5-11]通過數據導入向導導入文本數據文件。首先啟動導入數據向導,啟動導入數據向導有不同的方法:*通過菜單命令,執(zhí)行“File”菜單下的“ImportData”命令。*在MATLAB命令行中,鍵入指令uiimport。*執(zhí)行MATLAB的“Start”菜單中“MATLAB”子菜單下的“ImportWizard”命令。圖5-4啟動數據導入向導的初始畫面
單擊“Browse”按鈕,在彈出的對話框中選擇需要加載的數據文件,單擊“打開”按鈕,對話框如圖5-5所示。圖5-5選擇需要加載的數據文件用鼠標選擇需要打開的文件,然后單擊“打開”按鈕之后,數據導入向導嘗試分析并加載數據文件,并且將能夠加載的數據顯示在圖形界面中,如圖5-6所示。
圖5-6加載了數據的數據導入對話框
在如圖5-5的對話框中可以通過data、textdata和colheaders標簽頁查看導入的數據,若導入正確無誤后,單擊Next按鈕,對話框將要求用戶選擇數據的分隔符號,如圖5-7所示。
圖5-7選擇不同的分隔符號
在對話框中可以直接設置的分隔符有逗號(Comma)、空格符(Space)、分號(Semicolon)、制表符(Tab)或者自定義(Other),當選擇自定義(Other)方式時,需要在相應的文本輸入框中指定分隔符字符。不同的數據文件包含的數據分隔符不盡相同,所以不同的分隔符號在同樣的數據文件中導入的數據也不一樣。在這一步驟中一定要選擇合適的數據分隔符,之后單擊“Next”按鈕,對話框要求選擇不同的數據變量,如圖5-8所示。圖5-8選擇數據變量
選擇數據變量之后就可以單擊“Finish”按鈕完成整個數據導入的過程,這時在MATLAB的工作空間中,將出現剛才導入的兩個變量,在MATLAB中鍵入whos命令察看:>>whosNameSizeBytesClassAttributes
colheaders 1x13860celldata
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- T/CAMIR 003-2022媒體大數據分類分級指南
- 法治相關面試題及答案
- 公司面試題型及答案
- 惡劣環(huán)境面試題及答案
- T/CAEPI 48-2022固定污染源二氧化碳排放連續(xù)監(jiān)測技術規(guī)范
- 磁共振呼吸導航技術應用與優(yōu)化
- 醫(yī)院全面托管合同范本
- 建筑拆改安全合同范本
- 幼兒園炊事員合同范本
- 農副產品供貨合同范本
- GB/T 44567-2024光學晶體紫外級氟化鈣晶體
- 小學二年級數學找規(guī)律練習題及答案
- 智研咨詢重磅發(fā)布:2024年中國航運行業(yè)供需態(tài)勢、市場現狀及發(fā)展前景預測報告
- 第五屆全國電力行業(yè)青年培訓師教學技能競賽考試題庫-中(多選題)
- 八年級地理下冊 第六章 第二節(jié)“白山黑水”──東北三省教案 (新版)新人教版
- 2024年廣東省廣州市白云區(qū)中考二模英語試題(解析版)
- DL∕T 741-2019 架空輸電線路運行規(guī)程
- 潛水主題素材課件
- 三供一業(yè)移交政策規(guī)定
- 小班活動學情分析
- 國家開放大學《合同法》章節(jié)測試參考答案
評論
0/150
提交評論