




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、MATLAB 之工程應用1檔案讀寫方煒 台大生機系MATLAB 之工程應用2本章重點nMATLAB 內建許多有關檔案讀寫的函數n對二進制檔案或 ASCII 檔案都可以進行處理n開啟n關閉n儲存MATLAB 之工程應用3高階的檔案讀寫指令n先列出常用讀寫檔案指令,稍後將介紹用法類別支援檔案格式指令 一般資料MAT - MATLAB workspaceload, saveCSV - Comma separated numberscsvread, csvwriteDAT - Formatted textImportdataDLM - Delimited textdlmread, dlmwriteTA
2、B - Tab separated text試算表XLS - Excel worksheetXlsreadWK1 - Lotus 123 worksheetwk1read, wk1writeMATLAB 之工程應用4高階的檔案讀寫指令(cont)類別支援檔案格式指令 科學資料CDF - Common Data FormatFITS - Flexiblecdfread, cdfwriteImage Transport SystemFitsreadHDF - Hierarchical Data Formathdfread, hdfwrite電影AVI - Movieaviread影像TIFF, P
3、NG, HDF, BMP, JPEG, GIF, PCX, XWD, CUR, ICO, RAS, PBM, PGM, PPMimread, imwrite音訊AU, SND - NeXT/Sun soundauread, auwriteWAV - Microsoft Wave soundwavread, wavwriteMATLAB 之工程應用5csvreadn使用 csvread 指令來讀取n條件:n資料檔案是由逗號分開n只有包含數值資料nEx:csvread01.mfprintf(data.csv 的內容:n);type data.csv% 列出 data.csv 的內容A = csvr
4、ead(data.csv) % 將 data.csv 的內容讀到矩陣 AMATLAB 之工程應用6resultdata.csv 的內容:1, 2, 34, 56, 7, 8, 9A =1 2 3 04 5 0 06 7 8 9ncsvread 會傳回一個數值矩陣n其中缺席的資料將以 0 填入。MATLAB 之工程應用7dlmreadn如果數值資料的分界符號(Delimiters)不是逗點,就不能使用 csvread 指令,而要改用 dlmread 指令nEx:dlmread01.mfprintf(data.dlm 的內容:n);type data.dlm% 列出 data.dlm 的內容A =
5、 dlmread(data.dlm, t)% 將 data.dlm 的內容讀到矩陣 AMATLAB 之工程應用8Resultdata.dlm 的內容:123456789A =1 2 3 04 5 0 06 7 8 9n上例中data.dlm 的資料是以定位鍵(Tab)隔開,因此 dlmread 指令的第二個引數是 t,以代表定位鍵MATLAB 之工程應用9textreadn如果檔案資料包含數值及字串,我們就必須改用 textread 指令nEx:textread01.mfprintf(data.txt 的內容:n);type data.txt% 列出 data.txt 的內容name, hob
6、by, age = textread(data.txt, %s%s%d)MATLAB 之工程應用10resultdata.txt 的內容:Timmy OnlineGames 13Annie Chatrooms 10Roger Tennis 41name = Timmy Annie Rogerhobby = OnlineGames Chatrooms Tennisage = 13 10 41在上述範例中,data.txt 包含三個欄位(或是三直行的資料)ntextread 可在第二個引數指定資料型態n例如上例中 %s 代表字串,%d 代表整數n也同時將讀入的資料設定到不同的輸出引數n由於資料型態
7、的不同,輸出引數也有不同的型態n以上述範例來說,name 和 hobby 都是字串異質陣列,而 age 則是數值陣列。MATLAB 之工程應用11使用定位鍵來分隔欄位n上例中,我們利用空格來分隔欄位n如果欄位值本身也有空格 ?n改用定位鍵來分隔欄位nEx:textread02.mfprintf(data2.txt 的內容:n);type data2.txt% 列出 data2.txt 的內容name, hobby, age = textread(data2.txt, %s%s%d, delimiter, t)MATLAB 之工程應用12resultn結果與前一例相同ntextread 指令中加
8、上對分界字元(Delimiters)的定義,就可以讀出由定位鍵所分隔的資料檔案n若不指定時,預設為空白鍵MATLAB 之工程應用13讀取文字檔ntextread 也可以讀取一個文字檔n同時把檔案內的每一列文字變成字串異質陣列裡面的每一個元素nEx:textread03.mContents = textread(textread03.m,%s,delimiter,n,whitespace,);class(contents)% 印出 contents 的資料類別contents1% 列出 contents 第一列contents2% 列出 contents 第二列MATLAB 之工程應用14Res
9、ultans =cellans =contents=textread(textread03.m,%s,delimiter,n,whitespace,);ans =class(contents)% 印出 contents 的資料類別n上例使用 textread 讀入 textread03.m(也就是此範例檔案),並顯示此檔案的第一列和第二列。ntextread 指令的用法還有很多,功能也很強大n在MATLAB下輸入help textreadn可以得到完整的技術支援。MATLAB 之工程應用15Filereadn若只是要將一個檔案的內容送到一個字串,可以使用 fileread 指令nEx:範例16
10、-6:fileread01.mout = fileread(data2.txt);class(out)size(out)MATLAB 之工程應用16Resultans =charans =1 64n上例中,fileread 指令會將檔案 data2.txt 的內容送到字串變數 outnclass(out) 的值是 char ,顯示 out 的資料型態是字串nsize(out) 顯示字串 out 的長度是 64。MATLAB 之工程應用17更繁複的檔案格式n一般情況下n盡量採取先前介紹的指令來進行讀寫。n資料格式比較繁複時n需要一列一列讀進來n再進行剖析(Parsing)n相關指令將在以下介紹。
11、MATLAB 之工程應用18開啟檔案n無論讀寫 ASCII 或二進制檔案,都必需先用 fopen 函數來開啟檔案,語法如:nfid = fopen(filename, permission)n其中 filename 表示欲讀寫的檔案名稱npermission 則表示欲對檔案進行的處理方式,可以是下列任一字串:nr:只准讀取(reading)檔案nw:只准寫入(writing)檔案na:只准加入(appending)檔案na+:可讀取及加入檔案(reading and appending)n省略第二個引數,permission 的預設值就是 r。MATLAB 之工程應用19有關fopenn在wi
12、ndows下,permission 字串必需能夠分辨binary或 ASCII 檔案。n例如:若要讀binary檔案,則 permission 字串必需是“rb” nfopen 另外支援很多 permission 字串,可輸入 help fopen 得到完整的資訊。nfopen 函數傳回一個檔案辨識碼,通常是個非負的整數,我們可用此辨識碼來對此檔案進行各種讀寫的處理。MATLAB 之工程應用20Ex: fopen01.mn上例可知當檔案不存在時,回傳的 fid 是 1n同時 message 會包含相關的錯誤資訊。fid, message = fopen(no_such_file, r);fpr
13、intf(fid = %dn, fid); fprintf(message = %sn, message);fid = -1message = Sorry. No help in figuring out the problem . . .MATLAB 之工程應用21Ex: fopen02.mn若開啟成功,則傳回的 fid 是一個大於 2 的整數,而且傳回的 message 是一個空字串,例如:fid, message = fopen(fopen02.m, r);fprintf(fid = %dn, fid);fprintf(message = %sn, message);fid = 3mes
14、sage =MATLAB 之工程應用22Tips:nfopen 可傳回第二個引數來顯示錯誤訊息。n為了安全起見,最好在每次使用 fopen 時,都測試其傳回的 fid 是否為有效值。nMATLAB 使用 fid=1 來代表標準輸出(Standard Output)nfid=2 代表標準錯誤輸出(Standard Error)n因此在使用這兩個 fid 的值時,可以不必使用 fopen 來開啟檔案。MATLAB 之工程應用23關閉檔案n完成檔案的讀寫之後,可用 fclose 函數來關閉檔案,用法如下:nstatus = fclose(fid);n若一切順利,fclose 傳回 0。n若無法順利關
15、閉檔案,則 fclose 傳回 -1。n為避免因開啟檔案過多而造成系統資源浪費,一般在完成檔案的讀寫後,即應使用 fclose 來關閉檔案MATLAB 之工程應用24Tips:n若要一次關閉所有開啟的檔案,可用 fclose(all) 或是 fclose all。n開啟及關閉檔案都是比較耗時的函數,因此盡量不要將他們置於迴圈之中,以提高程式執行效率。MATLAB 之工程應用25讀取 ASCII 檔案nfgetl 函數:n可將 ASCII 檔案的內容中的某一列讀出n並將該列的 ASCII 內容以轉成字串傳回。nEx:fgetl01.mfid = fopen(mean.m, r);while fe
16、of(fid)=0% feof 測試檔案指標是否已到達結束位置line = fgetl(fid);disp(line);endMATLAB 之工程應用26讀取 ASCII 檔案(cont)n執行上述程式後,MATLAB 會n先在目前目錄找尋 mean.mn若找不到,再根據搜尋路徑,找出 mean.m 指令的位置然後再將其內容一列一列地列出。n輸入which mean可顯示檔案所在的路徑nfgets 和 fgetl 均可由檔案讀取一列資料:nfgetl 會捨去換行字元nfgets 函數則保留換行字元MATLAB 之工程應用27應用:模擬unix的grep指令ngrep :用來找出包含某一特定字串
17、的一列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: %s n, line_number,line);endline_number = line_number + 1;endfclose(fid); MATLAB 之工程應用28resultn如欲列出 grep.m 中包含 matched 字串的
18、每一列,可輸入如下: grep(grep.m, matched) matched = findstr(line, pattern); if isempty (matched)MATLAB 之工程應用29fscanfn函數fscanf可對ascii檔案作更精確的讀取,用法如下:nmatrix = fscanf(fid, format)n其中 fid 是欲讀取之檔案的辨識碼nformat 是格式指定字串(Format Specifier)n常用的格式指定字串有下列幾種:n%s:字串n%d:10進位的整數n%g:雙倍精準(Double-precision)的浮點數(Floating-point Nu
19、mbers)n其他各種格式指定字串可輸入 help fscanf 來得到詳細的說明MATLAB 之工程應用30Ex: fscanf01.mn有一文字檔 test.txt 如下:1 4 9 16 2536 49 64 81 100 n欲使用 fscanf 指令讀取其內容,可輸入如下:nfid = fopen(test.txt, r);nmyData = fscanf(fid, %g);nfclose(fid);nmyData% 顯示 myDatamyData = 1 4 9 16 25 36 49 64 81 100MATLAB 之工程應用31Ex: sscanfnsscanf 函數和 fsca
20、nf 的功能很類似nsscanf 函數從字串(strings)中讀取資料nex:sscanf.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 之工程應用32寫入 ASCII 檔案nfprintf 函數可將資料依格式指定字串來寫入 ASCII 檔案,其使用語法如下:nfprintf(fid, format, y)n其中 fid 是欲寫入之檔案的辨
21、識碼nformat 是格式指定字串,用以指定資料寫至檔案的格式ny 是 MATLAB 的資料變數n常用的格式指定字串有下列幾種:n%e:科學記號,即將數值表示成 a10b 的形式n%f:固定欄寬(含整數與小數部份)的表示法n%g:自動選取 %e 或 %fn其他各種格式指定字串可輸入 help fprintf 來得到詳細的線上說明。MATLAB 之工程應用33Ex: fprintf01.mn將平方根表寫入檔案x = 1:10;y = x; sqrt(x);fid = fopen(squareRootTable.txt, w);fprintf(fid, Table of square root:r
22、n);fprintf(fid, %2.0f = %10.6frn, y);fclose(fid);dos(start squareRootTable.txt);% 開啟 squareRootTable.txtMATLAB 之工程應用34Resultn在上例中n%2.0f 印出的總欄寬為 2,且不帶小數n %10.6f 印出的總欄寬為 10,包含 6位的小數ntype squareRootTable.txt 來看結果MATLAB 之工程應用35sprintf nsprintf 函數和 fprintf 函數的功能很類似nsprintf 將資料以字串形式傳回nEx: str = sprintf(lo
23、g(%f) = %en, 2, log(2)str =log(2.000000) = 6.931472e-001MATLAB 之工程應用36暫存目錄n在某些應用上,可能需要用到暫存目錄及暫存檔案。n欲取用系統的暫存目錄,可用 tempdir如下: directory = tempdirnResult:directory =C:DOCUME1jangLOCALS1TempMATLAB 之工程應用37暫存檔案n欲開啟一暫存檔案,可用 tempname,如下: filename = tempnamenResult:filename =C:DOCUME1jangLOCALS1Temptp273132M
24、ATLAB 之工程應用38Tipsn不同系統下tempdir 和 tempname會依作業系統的環境變數而產生不同的回傳字串n例如在 Windows 98 作業系統下ntempdir 傳回的字串可能是 nC:windowstempn tempname 傳回的字串可能是n C:WINDOWSTEMPtp512124。MATLAB 之工程應用39應用:產生暫存的 HTML 檔案n以下利用 tempname 產生一個暫存的 HTML 檔案,然後再將此檔案顯示在瀏覽器。nEx: writeHTML.mfilename = tempname, .html;fid = fopen(filename, w)
25、;fprintf(fid, n);fprintf(fid, This is a test homepage written by MATLAB!n);fprintf(fid, );fclose(fid);dos(start , filename);% 啟動和 .html 相連結的應用程式MATLAB 之工程應用40Resultn上例產生之網頁如下:n讓MATLAB 的計算結果可用列表(Table)或多媒體檔案(如影像、聲音、動畫等)來呈現時,由網頁來顯示這些結果是不錯的選擇。MATLAB 之工程應用41網路檔案的讀取nMATLAB 也可以直接讀取網路上的檔案n通常採用 URL(Universa
26、l Resource Locator)的方式來指定這些網路上的檔案:n一般網頁:nhttp:/nFTPnftp:/ 之工程應用42urlread n上例中使用 urlread 指令來讀取筆者在台大生機系的首頁n同時disp(); 將結果指定到字串變數 contentsnEx: urlread01.mcontents = urlread(.tw/cea/cea1.htm); disp(contents);MATLAB 之工程應用43urlwrite n urlwrite可以直接在讀取網頁後,就儲存到本機硬碟中nEx:urlread02.mte
27、mpFile = tempname, .html;% 指定暫存檔案urlwrite(http:/.tw, tempFile);% 將網頁內容寫到檔案dos(start , tempFile);% 開啟此檔案MATLAB 之工程應用44Urlwrite(cont)n在上例中,我們將 .tw 的網頁內容寫到一個暫存檔案n然後再使用瀏覽器開啟此檔案。n另一個和網路相關的功能 sendmailn可用來寄發電子郵件n雖然這個功能和檔案讀寫沒有直接關係,但也在此一併說明。MATLAB 之工程應用45sendmailnSendmail 指令的用法:nsendmail(TO, SUBJECT, MESSAGE
28、, ATTACHMENTS)nTO:收件者n若是只有一位收件者,可用字串表示n若是有多位收件者,可以使用字串異質陣列來表示。nSUBJECT:主題,以字串表示。nMESSAGE:電子郵件的內容,以字串表示。nATTACHMENTS:附加檔案,用異質陣列來表示。MATLAB 之工程應用46Ex: sendmail01.mn請將 to 的內容改為你自己本身的電子郵件,並試著執行一次,以確認此程式碼的正確性。to = email1aaa.bbb.ccc, email2aaa.bbb.ccc;subject = Test email from a MATLAB program;message = Th
29、is is a test email sent via sendmail.;attachment = c:windowsmatlab.ini;sendmail(to, subject, message, attachment);MATLAB 之工程應用47TipsnMATLAB 6.5 的sendmail 不支援中文。nMATLAB 7.0 對 sendmail 新增了一些新功能n請輸入 help sendmail 來獲取最新的線上支援。n若要在郵件內容加入換列,可以使用 ASCII 碼10n例如:message=Sir:, 10, This is a test。MATLAB 之工程應用48讀
30、取二進制資料n用fread 函數可從檔案中讀取二進制資料nfread會將每一個位元組看成一個整數,並將結果以一矩陣傳回。n例如,檔案 test2.txt 的內容如下:This is a test!MATLAB 之工程應用49Ex: fread01.mnResult:This is a test!nchar 可將 myData 的整數轉成 ASCII 字元n取 myData 的轉制是為了使印出的效果易於閱讀fid = fopen(test2.txt, r);myData = fread(fid);char(myData)% 驗證所讀入的資料是否正確fclose(fid);MATLAB 之工程應用
31、50Ex: fread02.mnfread 函數可用第二個輸入引數來控制傳回矩陣的大小fid = fopen(test2.txt, r);myData = fread(fid, 4)% 只讀 4 個位元組fclose(fid);myData = 84 104 105 115MATLAB 之工程應用51Ex: fread03.mnResult:myData = 84 105 32 104 115 105n此時 myData 為 2X3 的矩陣。np.s.上例中為長度4的向量fid = fopen(test2.txt, r);myData = fread(fid, 2 3)fclose(fid);
32、MATLAB 之工程應用52Fread的第3個引數n控制 fread 在將二進制資料轉成 MATLAB 矩陣時所用的精確度n包含:n一次讀取的位元數(Number of Bits)n這些位元數所代表的資料型態n常用的精準度有下列幾種: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:單精準浮點
33、數(32 bits)double:雙精準浮點數(64 bits)MATLAB 之工程應用53Ex: fread04.mnResult:myData = 26708myData2 = 26708fid = fopen(test2.txt, r);myData = fread(fid, 1, short)fclose(fid);myData2 = bin2dec(dec2bin(abs(h),8), dec2bin(abs(T),8)MATLAB 之工程應用54說明: fread04.mn上例將 text2.txt 以短整數的方式讀入n也就是以 16 bit 為一個單位來轉換成整數1.讀出來的第一
34、個數字,會等於將 h 和 T 轉換成 8 bit,再並排成 16 bits2.然後再轉換成十進位的整數值n要注意的是:n雖然原檔案的前兩個位元組是 T 和 h,但是在以 16 bits 為一個單位時nT 會是 LSB(Least Significant Bits)n而 h 則是 MSB(Most Significant Bits)n因此我們再重組成 16 bits 時,h 會在前而 T 會在後。MATLAB 之工程應用55寫入二進制檔案nfwrite 函數:n矩陣 - 二進制格式 - 寫入檔案n傳回成功寫入的個數。n以下用fwrite 產生一大小為 40 bytes 的二進制檔案n在使用 ty
35、pe 指令來顯示檔案內容時,看不到其內容n因為是 binary 檔案n如果 count 的值小於 10,就表示 fread 的運算有誤nEx: fwrite01.mfid = fopen(test.bin, w);count = fwrite(fid, randperm(10), int32);fclose(fid);type test.binMATLAB 之工程應用56控制檔案位置指標n檔案位置指標:n決定下一次進行資料讀取或寫入的位置。n控制此指標的函數如下:nfeof測試指標是否在檔案結束位置nfseek設定指標位置nftell取得指標位置nfrewind重設指標至檔案起始位置MATLAB 之工程應用57foefn測試指標是否在檔案結束位置nEx:feof01.mfid = fopen(test.txt);A = fscanf(fid, %g, 3 4)feof(fid)n在上例中,feof(fid) 傳回 1,表示檔案指標已經在檔案結束位置n因為 test.txt 只包含 10 個數目字。MATLAB 之工程應用58resultA
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 管理学岗位设置
- 法医临床检验规范
- 电商退换货快递服务协议
- 钟表店翻新拆旧协议
- 物联网在智能交通管理中的创新方案
- 家政安保居间服务协议
- 股东向公司借款合同范本
- 2024浙江信息工程学校工作人员招聘考试及答案
- 2024湖南三一工业职业技术学院工作人员招聘考试及答案
- 钢材采购合同协议
- DB42-T 2275-2024 消防给水设施物联网系统技术标准
- 七律长征读书分享 课件
- 2024年新物业管理技能及理论知识考试题与答案
- 《工程经济学》题集
- 《直播运营实务》 课件 5.3直播间场景搭建
- 2024汽车行业社媒营销趋势【微播易CAA中国广告协会】-2024-数字化
- NB/T 11440-2023生产煤矿储量估算规范
- 华为产品战略规划全景训战两份资料
- 二手车交易定金合同范本5篇
- 2024年福建省中考化学试卷附答案
- 经营异常授权委托书范本
评论
0/150
提交评论