MATLAB程式设计入门篇档案读写_第1页
MATLAB程式设计入门篇档案读写_第2页
MATLAB程式设计入门篇档案读写_第3页
MATLAB程式设计入门篇档案读写_第4页
MATLAB程式设计入门篇档案读写_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、MATLAB 程式設計入門篇檔案讀寫張智星 (Roger Jang)/jang清大資工系 多媒體檢索實驗室MATLAB 程式設計入門篇:讀寫檔案本章重點n很多計算工作的第一步就要是讀取資料nMATLAB 內建許多有關檔案讀寫的函數,可對二進制檔案或 ASCII 檔案進行下列處理:n開啟n關閉n儲存MATLAB 程式設計入門篇:讀寫檔案高階的檔案讀寫指令(1/2)n先列出常用讀寫檔案指令,稍後將介紹用法類別支援檔案格式指令 一般資料MAT - MATLAB workspaceload, saveCSV - Comma separated

2、 numberscsvread, csvwriteDAT - Formatted textImportdataDLM - Delimited textdlmread, dlmwriteTAB - Tab separated text試算表XLS - Excel worksheetXlsreadWK1 - Lotus 123 worksheetwk1read, wk1writeMATLAB 程式設計入門篇:讀寫檔案高階的檔案讀寫指令(2/2)類別支援檔案格式指令 科學資料CDF - Common Data FormatFITS - Flexiblecdfread, cdfwriteImage T

3、ransport SystemFitsreadHDF - Hierarchical Data Formathdfread, hdfwrite電影AVI - Movieaviread影像TIFF, PNG, HDF, BMP, JPEG, GIF, PCX, XWD, CUR, ICO, RAS, PBM, PGM, PPMimread, imwrite音訊AU, SND - NeXT/Sun soundauread, auwriteWAV - Microsoft Wave soundwavread, wavwriteMATLAB 程式設計入門篇:讀寫檔案csvreadn使用 csvread 指

4、令來讀取n條件:n資料檔案是由逗號分開n只有包含數值資料nEx:csvread01.mfprintf(data.csv 的內容:n);type data.csv% 列出 data.csv 的內容A = csvread(data.csv) % 將 data.csv 的內容讀到矩陣 AMATLAB 程式設計入門篇:讀寫檔案執行結果data.csv 的內容:1, 2, 34, 56, 7, 8, 9A =1 2 3 04 5 0 06 7 8 9ncsvread 會傳回一個數值矩陣n其中缺席的資料將以 0 填入。MATLAB 程式設計入門篇:讀寫檔案dlmreadn如果數值資料的分界符號(Delim

5、iters)不是逗點,就不能使用 csvread 指令,而要改用 dlmread 指令nEx:dlmread01.mfprintf(data.dlm 的內容:n);type data.dlm% 列出 data.dlm 的內容A = dlmread(data.dlm, t)% 將 data.dlm 的內容讀到矩陣 A,資料是以定位鍵隔開, MATLAB 程式設計入門篇:讀寫檔案執行結果data.dlm 的內容:123456789A =1 2 3 04 5 0 06 7 8 9n上例中data.dlm 的資料是以定位鍵(Tab)隔開,因此 dlmread 指令的第二個引數是 t,以代表定位鍵MAT

6、LAB 程式設計入門篇:讀寫檔案textreadn如果檔案資料包含數值及字串,我們就必須改用 textread 指令nEx:textread01.mfprintf(data.txt 的內容:n);type data.txt% 列出 data.txt 的內容name, hobby, age = textread(data.txt, %s%s%d)MATLAB 程式設計入門篇:讀寫檔案執行結果data.txt 的內容:Timmy OnlineGames 13Annie Chatrooms 10Roger Tennis 41name = Timmy Annie Rogerhobby = Online

7、Games Chatrooms Tennisage = 13 10 41在上述範例中,data.txt 包含三個欄位(或是三直行的資料)ntextread 可在第二個引數指定資料型態n例如上例中 %s 代表字串,%d 代表整數n也同時將讀入的資料設定到不同的輸出引數n由於資料型態的不同,輸出引數也有不同的型態n以上述範例來說,name 和 hobby 都是字串異值陣列,而 age 則是數值陣列。MATLAB 程式設計入門篇:讀寫檔案使用定位鍵來分隔欄位n上例中,我們利用空格來分隔欄位n如果欄位值本身也有空格 ?n一般常見的作法,是使用定位鍵來分隔欄位nEx:textread02.mfprint

8、f(data2.txt 的內容:n);type data2.txt% 列出 data2.txt 的內容name, hobby, age = textread(data2.txt, %s%s%d, delimiter, t)MATLAB 程式設計入門篇:讀寫檔案執行結果n結果與前一例相同ntextread 指令中加上對分界字元(Delimiters)的定義,就可以讀出由定位鍵所分隔的資料檔案n若不指定時,預設為空白鍵MATLAB 程式設計入門篇:讀寫檔案讀取文字檔ntextread 也可以讀取一個文字檔,同時把檔案內的每一列文字變成字串異質陣列裡面的每一個元素nEx:textread03.mCo

9、ntents = textread(textread03.m,%s,delimiter,n,whitespace,);class(contents)% 印出 contents 的資料類別contents1% 列出 contents 第一列contents2% 列出 contents 第二列MATLAB 程式設計入門篇:讀寫檔案執行結果ans =cellans =contents=textread(textread03.m,%s,delimiter,n,whitespace,);ans =class(contents)% 印出 contents 的資料類別n上例使用 textread 讀入 te

10、xtread03.m(也就是此範例檔案),並顯示此檔案的第一列和第二列。ntextread 指令的用法還有很多,功能也很強大n在MATLAB下輸入help textread,可以得到完整的技術支援。MATLAB 程式設計入門篇:讀寫檔案Filereadn若只是要簡單地將一個檔案的內容送到一個字串,可以使用 fileread 指令nEx:範例16-6:fileread01.mout = fileread(data2.txt);class(out)size(out)MATLAB 程式設計入門篇:讀寫檔案執行結果ans =charans =1 64n上例中,fileread 指令會將檔案 data2

11、.txt 的內容送到字串變數 outnclass(out) 的值是 char ,顯示 out 的資料型態是字串nsize(out) 顯示字串 out 的長度是 64。MATLAB 程式設計入門篇:讀寫檔案影像與音訊檔案n有關於影像檔案的讀寫,請參閱本書第十九章影像顯示與讀寫;n有關音訊檔案的讀寫,請參閱本書第二十章音訊讀寫、錄製與播放。MATLAB 程式設計入門篇:讀寫檔案更繁複的文字檔案格式n一般情況下n盡量採取先前介紹的內建指令來進行讀寫,效率才會高。n資料格式比較繁複時n需要一列一列讀進來,再進行剖析(Parsing)n相關指令將在以下介紹。MATLAB 程式設計入門篇:讀寫檔案開啟檔案

12、n無論讀寫 ASCII 或二進制檔案,都必需先用 fopen 函數來開啟檔案,語法如:nfid = fopen(filename, permission)n其中 filename 表示欲讀寫的檔案名稱npermission 則表示欲對檔案進行的處理方式,可以是下列任一字串:nlr:只准讀取(reading)檔案nlw:只准寫入(writing)檔案nla:只准加入(appending)檔案nla+:可讀取及加入檔案(reading and appending)n省略第二個引數,permission 的預設值就是 r。MATLAB 程式設計入門篇:讀寫檔案有關fopenn在windows下,pe

13、rmission 字串必需能夠分辨binary或 ASCII 檔案。n例如:若要讀binary檔案,則 permission 字串必需是“rb” nfopen 另外支援很多 permission 字串,可輸入 help fopen 得到完整的資訊。nfopen 函數傳回一個檔案辨識碼(通常是個大於2的整數),我們可用此辨識碼來對此檔案進行各種讀寫的處理。MATLAB 程式設計入門篇:讀寫檔案Ex:fopen01.mn上例可知當檔案不存在時,回傳的 fid 是 1n同時 message 會包含相關的錯誤資訊。fid, message = fopen(no_such_file, r);fprint

14、f(fid = %dn, fid); fprintf(message = %sn, message);fid = -1message = Sorry. No help in figuring out the problem . . .MATLAB 程式設計入門篇:讀寫檔案Ex:fopen02.mn若開啟成功,則傳回的 fid 是一個大於 2 的整數,而且傳回的 message 是一個空字串,例如:fid, message = fopen(fopen02.m, r);fprintf(fid = %dn, fid);fprintf(message = %sn, message);fid = 3me

15、ssage =MATLAB 程式設計入門篇:讀寫檔案提示n為了安全起見,最好在每次使用 fopen 時,都測試其傳回的 fid 是否為有效值。n輸出位置nMATLAB 使用 fid=1 來代表標準輸出(Standard Output)nfid=2 代表標準錯誤輸出(Standard Error)n若使用fid=1或2時,可不使用 fopen 來開啟檔案nTry this to see their difference:nfprintf(1, This is standard output!n);nfprintf(2, This is standard error!n);MATLAB 程式設計入

16、門篇:讀寫檔案關閉檔案n完成檔案的讀寫之後,記得要使用 fclose 函數來關閉檔案,用法如下:nstatus = fclose(fid);n若一切順利,fclose 傳回 0。n若無法順利關閉檔案,則 fclose 傳回 -1。n為避免因開啟檔案過多而造成系統資源浪費,一般在完成檔案的讀寫後,即應使用 fclose 來關閉檔案MATLAB 程式設計入門篇:讀寫檔案提示n若要一次關閉所有開啟的檔案,可用 fclose(all) 或是 fclose all。n開啟及關閉檔案都是比較耗時的函數,因此盡量不要將他們置於迴圈之中,以提高程式執行效率。MATLAB 程式設計入門篇:讀寫檔案讀取 ASCI

17、I 檔案(1/2)nfgetl 函數:n可將 ASCII 檔案的內容中的某一列讀出n並將該列的 ASCII 內容以轉成字串傳回。nEx:fgetl01.mfid = fopen(mean.m, r);while feof(fid)=0% feof 測試檔案指標是否已到達結束位置line = fgetl(fid);disp(line);endMATLAB 程式設計入門篇:讀寫檔案讀取 ASCII 檔案(2/2)n執行上述程式後,MATLAB 會n先在目前目錄找尋 mean.mn若找不到,再根據搜尋路徑,找出 mean.m 指令的位置然後再將其內容一列一列地列出。n輸入which mean可顯示檔

18、案所在的路徑nfgets 和 fgetl 均可由檔案讀取一列資料:nfgetl 會取得一列,但不包含換列字元nfgets 則保留換列字元MATLAB 程式設計入門篇:讀寫檔案應用:模擬unix的grep指令ngrep :用來找出包含某一特定字串的一列function grep(filename, pattern)fid = fopen(filename, r);line_number = 0;while feof(fid) = 0,line = fgetl(fid);matched = findstr(line, pattern);if isempty (matched)fprintf(%d:

19、 %s n, line_number,line);endline_number = line_number + 1;endfclose(fid); MATLAB 程式設計入門篇:讀寫檔案執行結果n如欲列出 grep.m 中包含 matched 字串的每一列,可輸入如下: grep(grep.m, matched) 6: matched = findstr(line, pattern); 7: if isempty (matched)n若要進行更複雜的字串比對,請參考本書姊妹作MATLAB 程式設計:進階篇中的第四章通用運算式。n例如要在一個檔案中找出b 和 d 中間夾1至3個母音的英文字MAT

20、LAB 程式設計入門篇:讀寫檔案fscanfn函數fscanf可對ascii檔案作更精確的讀取,用法如下:nmatrix = fscanf(fid, format)n其中 fid 是欲讀取之檔案的辨識碼nformat 是格式指定字串(Format Specifier)n常用的格式指定字串有下列幾種:n%s:字串n%d:10進位的整數n%g:雙倍精準(Double-precision)的浮點數n其他各種格式指定字串可輸入 help fscanf 來得到詳細的說明MATLAB 程式設計入門篇:讀寫檔案Ex:fscanf01.mn有一文字檔 test.txt 如下:1 4 9 16 2536 49

21、64 81 100 n欲使用 fscanf 指令讀取其內容,可輸入如下:nfid = fopen(test.txt, r);nmyData = fscanf(fid, %g);nfclose(fid);nmyData% 顯示 myDataMATLAB 程式設計入門篇:讀寫檔案執行結果myData = 1 4 9 16 25 36 49 64 81 100n上例顯示了 MATLAB 的 fscanf 指令和 C 的 fscanf 指令的最大不同:nMATLAB 的 fscanf 指令是向量化的(Vectorized)n只要讀入資料的型態正確,MATLAB 的 fscanf 指令會一再執行n同時把

22、所得結果存放於一個向量並回傳。MATLAB 程式設計入門篇:讀寫檔案sscanfnsscanf 函數和 fscanf 的功能很類似nsscanf 函數從字串(Strings)中讀取資料nex:sscanf01.mstr = num2str(pi, sqrt(2), log10(3)%建立一字串strretrieved = sscanf(str, %g)%擷取str中的doublestr =3.1416 1.4142 0.47712retrieved = 3.1416 1.4142 0.4771MATLAB 程式設計入門篇:讀寫檔案寫入 ASCII 檔案nfprintf 函數可將資料依格式指定字

23、串來寫入 ASCII 檔案,其使用語法如下:nfprintf(fid, format, y)n其中 fid 是欲寫入之檔案的辨識碼nformat 是格式指定字串,用以指定資料寫至檔案的格式ny 是 MATLAB 的資料變數n常用的格式指定字串有下列幾種:n%e:科學記號,即將數值表示成 a10b 的形式n%f:固定欄寬(含整數與小數部份)的表示法n%g:自動選取 %e 或 %fn其他各種格式指定字串可輸入 help fprintf 來得到詳細的線上說明。MATLAB 程式設計入門篇:讀寫檔案應用:將平方根表寫入檔案nEx:fprintf01.mx = 1:10;y = x; sqrt(x);f

24、id = fopen(squareRootTable.txt, w);fprintf(fid, Table of square root:rn);fprintf(fid, %2.0f = %10.6frn, y);fclose(fid);dos(start squareRootTable.txt);% 開啟 squareRootTable.txtMATLAB 程式設計入門篇:讀寫檔案執行結果n在上例中n%2.0f 印出的總欄寬為 2,且不帶小數n%10.6f 印出的總欄寬為 10,包含 6位的小數n請自行試驗後開啟 squareRootTable.txt 來驗證squareRootTable.

25、txtMATLAB 程式設計入門篇:讀寫檔案sprintf nsprintf 函數和 fprintf 函數的功能很類似nsprintf 將資料以字串形式傳回nEx: str = sprintf(log(%f) = %en, 2, log(2)str =log(2.000000) = 6.931472e-001MATLAB 程式設計入門篇:讀寫檔案暫存目錄n某些應用需要用到暫存目錄及暫存檔案。(例如:產生一個html檔案,再使用瀏覽器開啟。)n欲取用系統的暫存目錄,可用 tempdir如下: directory = tempdirnResult:directory =C:UsersjangApp

26、DataLocalTempMATLAB 程式設計入門篇:讀寫檔案暫存檔案n欲開啟一暫存檔案,可用 tempname,如下: filename = tempnamenResult:filename =C:UsersjangAppDataLocalTemptpda998b2b_cb6f_4b68_9814_6dbab1d44abdMATLAB 程式設計入門篇:讀寫檔案提示n上述範例是在 Windows 7 進行測試n不同系統下tempdir 和 tempname會依作業系統的環境變數而產生不同的回傳字串n若是在 Windows 98 作業系統下ntempdir 傳回的字串可能是 nC:window

27、stempn tempname 傳回的字串可能是n C:WINDOWSTEMPtp512124。MATLAB 程式設計入門篇:讀寫檔案應用:產生暫存的 HTML 檔案n以下利用 tempname 產生一個暫存的 HTML 檔案,然後再將此檔案顯示在瀏覽器。nEx: writeHTML.mfilename = tempname, .html;fid = fopen(filename, w);fprintf(fid, n);fprintf(fid, This is a test homepage written by MATLAB!n);fprintf(fid, );fclose(fid);dos

28、(start , filename);% 啟動和 .html 相連結的應用程式MATLAB 程式設計入門篇:讀寫檔案執行結果n上例產生之網頁如下:n當MATLAB 的計算結果可用列表(Table)或多媒體檔案(如影像、聲音、動畫等)來呈現時,由網頁來顯示這些結果是不錯的選擇。MATLAB 程式設計入門篇:讀寫檔案網路檔案的讀取nMATLAB 也可以直接讀取網路上的檔案n通常我們是採用 URL(Universal Resource Locator)的方式來指定這些網路上的檔案:n一般網頁:nhttp:/nFTPnftp:/ 程式設計入門篇:讀寫檔案urlread n上例中使用 urlread 指

29、令來讀取筆者在清華大學資訊系的首頁,同時將結果指定到字串變數 contentsnEx: urlread01.mcontents = urlread(.tw/jang); disp(contents);MATLAB 程式設計入門篇:讀寫檔案執行結果The link you just clicked is obsolete.You are being transported automatically to Roger Jangs current homepage at .tw/jang.MATLAB 程式設

30、計入門篇:讀寫檔案urlwrite 指令(1/2) n urlwrite指令可以直接在讀取網頁後,就儲存到本機硬碟中nEx:urlread02.mtempFile = tempname, .html;% 指定暫存檔案urlwrite(http:/.tw, tempFile);% 將網頁內容寫到檔案dos(start , tempFile);% 開啟此檔案MATLAB 程式設計入門篇:讀寫檔案urlwrite 指令(2/2)n在上例中,我們將 .tw 的網頁內容寫到一個暫存檔案,然後再使用瀏覽器開啟此檔案。n另一個和網路相關的功能 sendmailn可用來寄發電子郵件n雖然這個功能和檔案讀寫沒有

31、直接關係,但也在此一併說明。MATLAB 程式設計入門篇:讀寫檔案sendmail 指令nsendmail 指令的用法:nsendmail(to, subject, message, attachment)nto:收件者n若是只有一位收件者,可用字串表示n若是有多位收件者,可以使用字串異質陣列來表示。nsubject:主題,以字串表示。nmessage:電子郵件的內容,以字串表示。nattachment:附加檔案,用異質陣列來表示。MATLAB 程式設計入門篇:讀寫檔案Ex:sendmail01.mn請將 to 的內容改為你自己本身的電子郵件,並試著執行一次,以確認此程式碼的正確性。to =

32、email1aaa.bbb.ccc, email2aaa.bbb.ccc;subject = Test email from a MATLAB program;message = This is a test email sent via sendmail.;attachment = c:windowsmatlab.ini;sendmail(to, subject, message, attachment);MATLAB 程式設計入門篇:讀寫檔案提示n可能還需要先使用setpref來設定smtp server及發信人等。(MATLAB 會有提示文字。)n以上範例純粹以 MATLAB 6.5 為

33、主n根據筆者在 MATLAB 6.5 的測試,sendmail 目前還不支援中文。n而 MATLAB 7.0 對 sendmail 新增了一些新功能,請輸入 help sendmail 來獲取最新的線上支援。n若要在郵件內容加入換列,可以使用 ASCII 碼10n例如:message=Sir:, 10, This is a test。MATLAB 程式設計入門篇:讀寫檔案讀取二進制資料n用fread 函數可從檔案中讀取二進制資料nfread會將每一個位元組看成一個整數,並將結果以一矩陣傳回。n例如,檔案 test2.txt 的內容如下:This is a test!MATLAB 程式設計入門篇

34、:讀寫檔案Ex:fread01.mnResult:This is a test!nchar 可將 myData 的整數轉成 ASCII 字元n取 myData 的轉置是為了印出橫列,易於閱讀fid = fopen(test2.txt, r);myData = fread(fid);char(myData)% 驗證所讀入的資料是否正確fclose(fid);MATLAB 程式設計入門篇:讀寫檔案Ex:fread02.mnfread 函數可用第二個輸入引數來控制傳回矩陣的大小fid = fopen(test2.txt, r);myData = fread(fid, 4)% 只讀 4 個位元組fcl

35、ose(fid);myData = 84 104 105 115MATLAB 程式設計入門篇:讀寫檔案Ex:fread03.mnResult:myData = 84 105 32 104 115 105n此時 myData 為 2X3 的矩陣。fid = fopen(test2.txt, r);myData = fread(fid, 2 3)fclose(fid);MATLAB 程式設計入門篇:讀寫檔案Fread的第3個引數n控制 fread 在將二進制資料轉成 MATLAB 矩陣時所用的精確度n包含:n一次讀取的位元數(Number of Bits)n這些位元數所代表的資料型態n常用的精準度

36、有下列幾種:char:帶符號的字元(8 bits)uchar:不帶符號的字元(8 bits)short:短整數(16 bits)int:整數(通常是 32 bits)long:長整數(32 或 64 bits)ushort:不帶符號的短整數(16 bits)uint:不帶符號的整數(32 bits)ulong:不帶符號的長整數(32 或 64 bits)float:單精準浮點數(32 bits)double:雙精準浮點數(64 bits)MATLAB 程式設計入門篇:讀寫檔案Ex:fread04.mnResult:myData = 26708myData2 = 26708fid = fopen

37、(test2.txt, r);myData = fread(fid, 1, short)fclose(fid);myData2 = bin2dec(dec2bin(abs(h),8), dec2bin(abs(T),8)MATLAB 程式設計入門篇:讀寫檔案說明:fread04.mn上例將 text2.txt 以短整數的方式讀入n也就是以 16 bit 為一個單位來轉換成整數1.讀出來的第一個數字,會等於將 h 和 T 轉換成 8 bit,再並排成 16 bits2.然後再轉換成十進位的整數值n要注意的是:n雖然原檔案的前兩個位元組是 T 和 h,但是在以 16 bits 為一個單位時nT 會

38、是 LSB(Least Significant Bits)n而 h 則是 MSB(Most Significant Bits)n因此我們再重組成 16 bits 時,h 會在前而 T 會在後 The byte order is Little Endian!MATLAB 程式設計入門篇:讀寫檔案寫入二進制檔案nfwrite 函數:n矩陣 - 二進制格式 - 寫入檔案n傳回成功寫入的個數。n以下用fwrite 產生一大小為 40 bytes 的二進制檔案n在使用 type 指令來顯示檔案內容時,看不到其內容n因為是 binary 檔案n如果 count 的值小於 10,就表示 fread 的運算有

39、誤nEx: fwrite01.mfid = fopen(test.bin, w);count = fwrite(fid, randperm(10), int32);fclose(fid);type test.binMATLAB 程式設計入門篇:讀寫檔案控制檔案位置指標n檔案位置指標:n決定下一次進行資料讀取或寫入的位置。n控制此指標的函數如下:nfeof測試指標是否在檔案結束位置nfseek設定指標位置nftell取得指標位置nfrewind重設指標至檔案起始位置MATLAB 程式設計入門篇:讀寫檔案foefn測試指標是否在檔案結束位置nEx:feof01.mfid = fopen(test.txt);A = fscanf(fid, %g, 3 4)feof(fid)n在上例中,feof(fid

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论