




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
5.1高級例程函數(shù)5.2低級例程函數(shù)5.3數(shù)據(jù)導(dǎo)入向?qū)?.1高級例程函數(shù)5.1.1MAT數(shù)據(jù)文件操作MAT數(shù)據(jù)文件是MATLAB獨(dú)有的數(shù)據(jù)文件格式,這種文件是一種二進(jìn)制格式文件,擴(kuò)展名為?.mat。這些*.mat文件之所以能夠獨(dú)立于各種平臺,是因?yàn)樵贛AT數(shù)據(jù)文件內(nèi)帶有設(shè)備的簽名,MATLAB在導(dǎo)入這種數(shù)據(jù)文件時將檢查這個簽名,如果發(fā)現(xiàn)文件來源不同于當(dāng)前的系統(tǒng),則自動進(jìn)行必要的轉(zhuǎn)換。MAT數(shù)據(jù)文件的文件格式組成如圖5-1所示。一般MAT數(shù)據(jù)文件分為兩個部分:文件頭部和數(shù)據(jù)。其中,文件的頭部主要包括一些描述性文字和相應(yīng)的版本與標(biāo)識,這部分占用了120多字節(jié);此后依次是保存在MAT文件中的數(shù)據(jù),數(shù)據(jù)是按照數(shù)據(jù)類型、數(shù)據(jù)長度和數(shù)據(jù)三個部分保存的。MAT文件是MATLAB獨(dú)有的文件格式,提供了跨平臺的數(shù)據(jù)交換能力,也是MATLAB用戶最常用的數(shù)據(jù)文件格式。在MATLAB中,可以將當(dāng)前工作空間中的變量保存成MAT文件,也可以將MAT文件中的數(shù)據(jù)導(dǎo)入到MATLAB的工作空間中。這兩個過程分別使用save命令和load命令來完成。save命令能夠?qū)?dāng)前工作空間中的變量保存到指定的數(shù)據(jù)文件中。其基本語法如下:其中,option可以有如下幾種可能:load命令將數(shù)據(jù)文件的數(shù)據(jù)導(dǎo)入到MATLAB工作空間,其基本的語法如下:下面結(jié)合具體的操作實(shí)例來說明save和load命令的使用方法?!纠?-1】save和load命令示例。在MATLAB命令行窗體中,鍵入下面的命令:>>clearall;clc;創(chuàng)建變量:>>x1=2;x2=3;x3=4;y1=0;保存數(shù)據(jù):>>savexdatax1x2察看當(dāng)前路徑下的MAT文件:>>str=what(pwd)str=structwithfields:path:'D:\MyDocuments\MyWorks\MATLAB\Class\ML01_v4\Ch5'm:{8×1cell}mlapp:{0×1cell}mlx:{0×1cell}mat:{'xdata.mat'}mex:{0×1cell}mdl:{0×1cell}
slx:{0×1cell}sfx:{0×1cell}p:{0×1cell}classes:{0×1cell}packages:{0×1cell}將數(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ù)文件則會報(bào)錯:>>whos-filexdata2.datErrorusingwhosCouldnotopenxdata2.datasavalidMAT-file.例5-1演示了使用save和load命令保存加載數(shù)據(jù)的基本過程,需要注意保存數(shù)據(jù)文件時通配符“*”的使用。在例5-1的操作中,MATLAB將所有以x開頭的變量保存到了純文本文件(xdata2.dat)中。另外,在加載文本格式的數(shù)據(jù)時,MATLAB將所有的數(shù)據(jù)保存在一個變量之中。同樣,在保存數(shù)據(jù)的時候,若不保存為二進(jìn)制格式的MAT文件,則最好指定數(shù)據(jù)文件的擴(kuò)展名。在使用save命令時需要注意,例5-1的保存數(shù)據(jù)文件的方法每次都會新建一個新的數(shù)據(jù)文件,也就是說,在不指定特別參數(shù)的情況下,每次保存數(shù)據(jù)文件時都會將原有數(shù)據(jù)全部覆蓋。如果確實(shí)需要向已經(jīng)存在的數(shù)據(jù)文件中追加數(shù)據(jù),則需要使用'-append'命令行參數(shù)。例如,在MATLAB命令行窗體中鍵入下面的命令:>>x1=2;x2=3;x3=4;y1=0;>>savexdatax1x2>>whos-filexdata.matNameSizeBytesClassAttributesx11x18doublex21x18double再次向同一個數(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(1000,1000);>>whosNameSizeBytesClassAttributesA1000x10008000000double保存數(shù)據(jù)文件:>>savefile1A察看數(shù)據(jù)文件所占硬盤空間:>>!dirfile*.matVolumeindriveDisWorkspaceVolumeSerialNumberis9C7B-BCD1DirectoryofD:\MyDocuments\MyWorks\MATLAB\Class\ML01_v4\Ch52020/11/2414:157,566,218file1.mat1File(s)7,566,218bytes0Dir(s)393,796,476,928bytesfree保存成非壓縮格式:>>savefile2A-v6察看數(shù)據(jù)文件所占硬盤空間:>>!dirfile*.matVolumeindriveDisWorkspaceVolumeSerialNumberis9C7B-BCD1DirectoryofD:\MyDocuments\MyWorks\MATLAB\Class\ML01_v4\Ch52020/11/2414:157,566,218file1.mat2020/11/2414:168,000,184file2.mat2File(s)15,566,402bytes0Dir(s)393,788,473,344bytesfree由上面的操作可以看到,在當(dāng)前的MATLAB版本下,默認(rèn)保存1?000?000個雙精度的數(shù)據(jù)所占用的硬盤空間為7?566?218B,而不壓縮時(使用參數(shù)-v6),則占用了8?000?184B。如果確實(shí)不想使用MATLAB數(shù)據(jù)文件壓縮保存的特性,則可以通過MATLAB的Preferences對話框中相應(yīng)的設(shè)置來取消數(shù)據(jù)文件壓縮特性。在處理結(jié)構(gòu)數(shù)據(jù)時,save和load有一些特殊的操作,見下面的示例?!纠?-3】save和load命令對結(jié)構(gòu)的操作。在MATLAB命令行窗體中,鍵入下面的命令:>>Movie.Name="Thunderball";>>Movie.Grade=6.9;>>Movie.LeadActor='SeanConnery';>>Movie.LeadActress='ClaudineAuger';>>whosNameSizeBytesClassAttributesMovie1x1898struct>>saveMovie.mat-structMovie>>clearall>>loadMovie.mat>>whosName SizeBytesClassAttributesGrade 1x18doubleLeadActor 1x1224charLeadActress 1x1428charName 1x1166string可以看到,當(dāng)使用了'-struct'命令行參數(shù)之后,save命令將結(jié)構(gòu)的不同字段分別作為變量保存在了MAT數(shù)據(jù)文件中,如果不使用這個參數(shù),則保存的數(shù)據(jù)就是一個結(jié)構(gòu)對象。5.1.2文本文件操作通常情況下,save和load命令僅用于處理.mat格式的數(shù)據(jù)文件,盡管利用這兩個命令也可以將數(shù)據(jù)加載或者保存為純文本格式的數(shù)據(jù)文件,但是要求數(shù)據(jù)文件內(nèi)容相對比較簡單。很多時候,第三方提供的數(shù)據(jù)文件數(shù)據(jù)之間具有特殊的間隔符,或者要求使用特別的間隔符間隔數(shù)據(jù),或者直接使用Excel電子表格形式保存了數(shù)據(jù),這時save或者load命令就不能發(fā)揮作用了。MATLAB對應(yīng)常見的標(biāo)準(zhǔn)數(shù)據(jù)文件提供了相應(yīng)的函數(shù),用來完成這些類型數(shù)據(jù)文件的加載和保存工作。表5-1對常用的數(shù)據(jù)文件讀寫函數(shù)進(jìn)行了總結(jié)。5.1.3導(dǎo)入其他類型數(shù)據(jù)文件除了前面講述的幾種數(shù)據(jù)文件類型以外,MATLAB還能夠加載聲音、圖像等二進(jìn)制數(shù)據(jù)文件。MATLAB能夠讀入的二進(jìn)制數(shù)據(jù)文件類型以及相應(yīng)的加載函數(shù)可以通過閱讀MATLAB幫助文檔中FileFormat的相關(guān)信息來了解其細(xì)節(jié)。表5-2總結(jié)了MALAB可以直接加載的常見二進(jìn)制數(shù)據(jù)文件類型。5.1.4導(dǎo)出二進(jìn)制格式數(shù)據(jù)MATLAB除了能夠?qū)肭懊娼榻B的各種格式的數(shù)據(jù)文件外,還可以將工作空間的數(shù)據(jù)導(dǎo)出成不同格式的文件。這一過程不僅可以通過圖形用戶界面完成,還可以通過MATLAB函數(shù)來完成。不過導(dǎo)出二進(jìn)制文件沒有統(tǒng)一的函數(shù)可以使用,不同格式的文件有不同的導(dǎo)出函數(shù)。表5-4對部分函數(shù)進(jìn)行了總結(jié)。5.2低級例程函數(shù)5.2.1打開與關(guān)閉文件在進(jìn)行文件讀寫之前必須將需要讀寫的文件在MATLAB中打開。打開文件的函數(shù)為fopen,其命令行格式如下:fid=fopen('filename','flag');其中,flag為控制文件讀寫的標(biāo)識符,它的取值可以如下所示。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)行讀的操作,還可以進(jìn)行數(shù)據(jù)追加操作,若文件不存在,則創(chuàng)建新的文件。若能夠成功地打開文件,則fid為非負(fù)的整數(shù),否則為-1。如果有錯誤信息,則可以作為fopen函數(shù)的第二個輸出參數(shù)輸出到工作空間來,所以使用fopen函數(shù)的常見代碼段如下所示。001 fid=0;002 filename=input('Openfile:','s');003 [fid,message]=fopen(filename,'r');004 iffid==-1005 disp(message)006 end這段代碼從命令行窗體中獲取一個文件名,然后用fopen函數(shù)打開它,若沒有成功,則將相應(yīng)的錯誤信息顯示在命令行窗體中。關(guān)閉已經(jīng)打開的文件需要使用fclose函數(shù),其基本的命令格式如下:status=fclose(fid)關(guān)閉文件之后,fid變量依然存在于工作空間中,但是對fid再進(jìn)行文件IO操作是錯誤的。若fclose函數(shù)運(yùn)行成功,則status為0,否則為-1。5.2.2讀寫數(shù)據(jù)打開文件之后就是進(jìn)行文件內(nèi)容的讀寫了,MATLAB提供了兩大類低級文件IO函數(shù)(二進(jìn)制文件讀寫函數(shù)和文本文件讀寫函數(shù)),用于進(jìn)行文件內(nèi)容的讀寫。表5-5對這些函數(shù)進(jìn)行了簡要總結(jié)。若在文件讀寫過程中出現(xiàn)了錯誤,則可以使用ferror函數(shù)獲取文件IO過程的錯誤信息。下面通過針對不同類型的文件的讀寫舉例來說明這些文件低級IO函數(shù)的使用方法。【例5-8】格式化輸入/輸出示例—txtio_example.m。001 function[data,count]=txtio_example002 %TXTIO_EXAMPLE例5-8文本文件的格式化輸入/輸出003 004 %打開一個文本文件寫入數(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','文本文件格式化輸入/輸出示例');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);在MATLAB中使用這些函數(shù)充分利用了基于向量或者矩陣的運(yùn)算特點(diǎn)。運(yùn)行例5-8,在MATLAB命令行中鍵入命令:>>[datacount]=txtio_example文本文件格式化輸入/輸出示例:data=123456789count=18上面的代碼中在012行向數(shù)據(jù)文件寫入數(shù)據(jù),由于是按照整數(shù)類型數(shù)據(jù)寫入的,所以每個元素占據(jù)2B空間,一共是18B的空間?!纠?-9】二進(jìn)制文件的讀寫—binio_example.m。001 function[data,count,status]=binio_example002 %binio_example例5-9二進(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ù)據(jù)的時候需要指定數(shù)據(jù)的類型和讀取數(shù)據(jù)的個數(shù)。例如,在例5-8的007、009行寫入數(shù)據(jù)時,分別要指定寫入數(shù)據(jù)的類型,在015、019行讀入數(shù)據(jù)時,需要指定讀取的數(shù)據(jù)類型和個數(shù),并且這些信息要同數(shù)據(jù)文件的內(nèi)容保持一致,否則讀入的數(shù)據(jù)就會不正確。表5-6總結(jié)了二進(jìn)制文件讀寫時常見的數(shù)據(jù)類型標(biāo)識符。若在fread函數(shù)或者fwrite函數(shù)進(jìn)行操作的時候不指定數(shù)據(jù)類型標(biāo)識符,則默認(rèn)按照uint8的格式讀寫數(shù)據(jù)。運(yùn)行例5-9的代碼,在MATLAB命令行中鍵入:>>[datacountstatus]=binio_example讀取數(shù)據(jù)類型:double讀取數(shù)據(jù)內(nèi)容:喂,你好嗎?data=17241815235714164613202210121921311182529count=25status=0除了表5-6總結(jié)的各種數(shù)據(jù)類型標(biāo)識符外,現(xiàn)在比較流行的還有C/C++編程語言的數(shù)據(jù)類型,如short、float、ushort、long等。5.2.3文件位置指針當(dāng)正確地打開文件并進(jìn)行數(shù)據(jù)的讀寫時,MATLAB會自動創(chuàng)建一個文件位置指針來管理維護(hù)文件讀寫數(shù)據(jù)的起始位置。所以,在進(jìn)行數(shù)據(jù)文件的讀寫時,需要通過某種手段來判斷當(dāng)前的文件位置指針,例如判斷當(dāng)前文件位置指針是否已經(jīng)到達(dá)文件尾部,將文件位置指針移動到指定的位置,獲取當(dāng)前文件位置指針在文件中的位置以及將文件位置指針重置在文件的頭部等。在MATLAB中,通過表5-7中的函數(shù)來控制判斷文件位置指針。fseek函數(shù)的命令行格式如下:status=fseek(fid,offset,origin)在命令行中,fid指已經(jīng)打開的數(shù)據(jù)文件,而offset是指移動文件指針的偏移量,若數(shù)值為正,則向文件尾部的方向移動數(shù)據(jù)文件指針,若數(shù)值為0,則不移動文件位置指針,若數(shù)值為負(fù)則向文件頭部的方向移動文件指針,offset的單位為字節(jié)。Origin為字符向量,代表文件指針的位置,有效值為bof,表示文件的頭部,cof表示當(dāng)前的文件指針位置,eof表示文件的尾部。函數(shù)的返回值status若為0,則表示操作成功,否則為-1。錯誤的類型可以用ferror函數(shù)獲取。MATLAB的文本文件格式化輸入操作函數(shù)中,有一個textscan函數(shù),同時MATLAB還提供了textread函數(shù)和strread函數(shù)可以處理純文本數(shù)據(jù)。MATLAB現(xiàn)在推薦用戶使用textscan函數(shù)來完成文本數(shù)據(jù)文件的讀取,這個函數(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ù)不一定與讀取的數(shù)據(jù)完全匹配,而且textscan函數(shù)提供比textread函數(shù)更加靈活的讀取數(shù)據(jù)方式。5.3數(shù)據(jù)導(dǎo)入向?qū)榱朔奖阌脩敉瓿蓴?shù)據(jù)導(dǎo)入,MATLAB還提供了一個叫作導(dǎo)入數(shù)據(jù)向?qū)У膱D形化工具。利用該工具就不必通過編寫程序來實(shí)現(xiàn)數(shù)據(jù)文件導(dǎo)入到MATLAB工作空間?!纠?-13】通過數(shù)據(jù)導(dǎo)入向?qū)?dǎo)入文本數(shù)據(jù)文件。在MATLAB命令行窗體中鍵入命令uiimport,此時將彈出對話框要求選擇數(shù)據(jù)源,如圖5-4所示。這里選擇File,即從數(shù)據(jù)文件導(dǎo)入數(shù)據(jù),這時MATLAB將啟動打開數(shù)據(jù)文件對話框。這個時候需要選擇導(dǎo)入的數(shù)據(jù)文件,在本
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 合同視角下的產(chǎn)品經(jīng)銷三方合作
- 工業(yè)園區(qū)食堂勞務(wù)合同標(biāo)準(zhǔn)版
- 梧州市長洲區(qū)政府綠化工程委托合同
- 隱名投資利益分配合同
- 代理社保業(yè)務(wù)合同合作協(xié)議2025
- 代理合作協(xié)議合同模板
- 搪瓷企業(yè)設(shè)備更新與技術(shù)改造考核試卷
- 旅游客運(yùn)突發(fā)事件應(yīng)急預(yù)案考核試卷
- 政策性銀行服務(wù)農(nóng)村電商與精準(zhǔn)扶貧考核試卷
- 后勤服務(wù)中的客戶關(guān)系管理測試考核試卷
- 借哪吒精神燃開學(xué)斗志 開學(xué)主題班會課件
- GB/T 45107-2024表土剝離及其再利用技術(shù)要求
- 一年級家長會課件2024-2025學(xué)年
- 2024年海南省??谑行∩鯏?shù)學(xué)試卷(含答案)
- 《中醫(yī)藥健康知識講座》課件
- 7S管理標(biāo)準(zhǔn)目視化管理標(biāo)準(zhǔn)
- 幼兒園安全教育課件:《危險的小圓珠》
- 廣東省五年一貫制語文試卷
- 過橋資金(新)
- 顱內(nèi)壓監(jiān)測的方法與護(hù)理ppt課件
- 房地產(chǎn)項(xiàng)目盈虧平衡分析
評論
0/150
提交評論