Matlab有著強(qiáng)大的數(shù)據(jù)處理功能,經(jīng)常需要從外部文件讀取數(shù)據(jù)或?qū)?shù)據(jù)寫到外部文件。Matlab和外部文件進(jìn)行數(shù)據(jù)交換相關(guān)的命令,個(gè)人目前了解到的有以下幾種。
(1)Load
load 從Matlab的數(shù)據(jù)文件.mat中讀取變量數(shù)據(jù),也可以從.txt .dat等文件中讀取數(shù)據(jù)。使用load命令讀取數(shù)據(jù)以后在Matlab中數(shù)據(jù)變量和文件同名。例如使用“load data.txt”后數(shù)據(jù)變量名即為data。
需要注意的是文件格式的不同,文件格式分為二進(jìn)制格式和ASCII格式兩種。如果是二進(jìn)制格式的文件,可以使用load命令直接讀取。但如果是ASCII格式的文件,需要保證數(shù)據(jù)是整齊的(每一行數(shù)據(jù)個(gè)數(shù)要一致),否則會(huì)出錯(cuò)。
例:
data.txt文件(ASCII格式)
0 1
1 2 3
0
使用“load data.txt”將會(huì)出錯(cuò)。
data1.txt文件
0 1 2
1 2 3
2 3 4
使用“load data1.txt”能順利讀入3*3矩陣。
和load相對應(yīng)的寫數(shù)據(jù)命令為save,一般存為.mat文件,save保存的文件格式為二進(jìn)制格式。
二進(jìn)制和ASCII的區(qū)別
從文件編碼的方式來看,文件可分為ASCII碼文件和二進(jìn)制碼文件兩種。
ASCII文件也稱為文本文件,這種文件在磁盤中存放時(shí)每個(gè)字符對應(yīng)一個(gè)字節(jié),用于存放對應(yīng)的ASCII碼。例如,數(shù)5678的存儲(chǔ)形式為: ASC碼:00110101(5) 00110110(6) 00110111(7) 00111000(8) 共占用4個(gè)字節(jié)。ASCII碼文件可在屏幕上按字符顯示, 例如源程序文件就是ASCII文件,用DOS命令TYPE可顯示文件的內(nèi)容。由于是按字符顯示,因此能讀懂文件內(nèi)容。 二進(jìn)制文件是按二進(jìn)制的編碼方式來存放文件的。例如,數(shù)5678的存儲(chǔ)形式為:00010110 00101110 (十進(jìn)制5678轉(zhuǎn)換成二進(jìn)制)只占二個(gè)字節(jié)。二進(jìn)制文件雖然也可在屏幕上顯示,但其內(nèi)容無法讀懂。C系統(tǒng)在處理這些文件時(shí),并不區(qū)分類型,都看成是字符流,按字節(jié)進(jìn)行處理。輸入輸出字符流的開始和結(jié)束只由程序控制而不受物理符號(如回車符)的控制。因此也把這種文件稱作“流式文件”。 (2)importdata
importdata根據(jù)文件名將數(shù)據(jù)導(dǎo)入到Matlab工作區(qū)。可以導(dǎo)入文件類型有很多,.txt .wav 等等。導(dǎo)入的數(shù)據(jù)(包括字符串和數(shù)值)以結(jié)構(gòu)形式存放在工作區(qū),可以使用whos命令來查看工作區(qū)的數(shù)據(jù)。
importdata可以導(dǎo)入load不能讀取的長短不一的ASCII文件。當(dāng)文件中既包含字符串又包含數(shù)值,而且數(shù)值長度個(gè)數(shù)不一時(shí),可以使用importdata命令。注意讀取的數(shù)值矩陣列數(shù)以文件中數(shù)值第一行的列數(shù)為標(biāo)準(zhǔn)。
例 test.txt
This is a test.
Start 0 1 2 1 2 1 2 3 4 運(yùn)行A=importdata('test.txt')
結(jié)果:
A =
data: [4x3 double]
textdata: {2x1 cell} A.data =
0 1 2
1 2 NaN 1 2 3 4 NaN NaN A.textdata =
'This is a test.'
'Start' 另外,讀取的字符串只能位于數(shù)值之前,位于數(shù)值之后的將被忽略。
例:test.txt
0 1 2
1 2 1 2 3 4 End. 運(yùn)行A=importdata('test.txt')
結(jié)果:
A =
0 1 2
1 2 NaN 1 2 3 4 NaN NaN 除了importdata命令以外,還可以從菜單選項(xiàng)file-->import data...導(dǎo)入數(shù)據(jù)文件,效果和importdata命令一樣。
(3)fopen
fopen打開一個(gè)文件并創(chuàng)建文件標(biāo)識(shí)以供接下來的讀寫等操作。fopen命令本身不進(jìn)行讀操作。然后可以使用fscanf讀取數(shù)據(jù),根據(jù)需要對數(shù)據(jù)進(jìn)行篩選編輯。
例:讀取字符串的方法
data.txt
0 1 2
1 2 3 1 2 3 End. fid=fopen('data.txt'); %打開文件,創(chuàng)建文件標(biāo)識(shí)
A=fscanf(A,'%c'); %讀取數(shù)據(jù)
fclose(fid); %關(guān)閉文件標(biāo)識(shí)
i=findstr(A,'End'); %查找標(biāo)識(shí)
B=A(1:i-3); %提取數(shù)據(jù),換行為2個(gè)字符
C=str2num(B); %將數(shù)據(jù)轉(zhuǎn)換成數(shù)值矩陣
結(jié)果:
A =
0 1 2
1 2 3
1 2 3
注意其中str2num同樣需要保證數(shù)值矩陣中列數(shù)一致,如果不一致,則結(jié)果為空。
例
0 1 2
1 2 1 2 3 End. 結(jié)果C=[]
例:讀取行的方法
fid1=fopen('data.txt');
fid2=fopen('numbers.txt','w'); while ~feof(fid1) aline=fgetl(fid1); if double(aline(1))>=48&&double(aline(1))<=57 fprintf(fid2,'%s\n',aline); continue end end fclose(fid1);
fclose(fid2); numbers.txt即為按行保存的數(shù)值文件
|
|