愛伊米

Matlab實現檔案讀寫的幾種方法

Matlab有著強大的資料處理功能,經常需要從外部檔案讀取資料或將資料寫到外部檔案。Matlab和外部檔案進行資料交換相關的命令,個人目前瞭解到的有以下幾種。

(1)Load

load 從Matlab的資料檔案。mat中讀取變數資料,也可以從。txt 。dat等檔案中讀取資料。使用load命令讀取資料以後在Matlab中資料變數和檔案同名。例如使用“load data。txt”後資料變數名即為data。

需要注意的是檔案格式的不同,檔案格式分為二進位制格式和ASCII格式兩種。如果是二進位制格式的檔案,可以使用load命令直接讀取。但如果是ASCII格式的檔案,需要保證資料是整齊的(每一行資料個數要一致),否則會出錯。

例:

data。txt檔案(ASCII格式)

01

12 3

0

使用“load data。txt”將會出錯。

data1。txt檔案

01 2

12 3

23 4

使用“load data1。txt”能順利讀入3*3矩陣。

和load相對應的寫資料命令為save,一般存為。mat檔案,save儲存的檔案格式為二進位制格式。

二進位制和ASCII的區別

從檔案編碼的方式來看,檔案可分為ASCII碼檔案和二進位制碼檔案兩種。ASCII檔案也稱為文字檔案,這種檔案在磁碟中存放時每個字元對應一個位元組,用於存放對應的ASCII碼。例如,數5678的儲存形式為:ASC碼:00110101(5) 00110110(6) 00110111(7) 00111000(8) 共佔用4個位元組。ASCII碼檔案可在螢幕上按字元顯示, 例如源程式檔案就是ASCII檔案,用DOS命令TYPE可顯示檔案的內容。由於是按字元顯示,因此能讀懂檔案內容。二進位制檔案是按二進位制的編碼方式來存放檔案的。例如,數5678的儲存形式為:00010110 00101110 (十進位制5678轉換成二進位制)只佔二個位元組。二進位制檔案雖然也可在螢幕上顯示,但其內容無法讀懂。C系統在處理這些檔案時,並不區分型別,都看成是字元流,按位元組進行處理。輸入輸出字元流的開始和結束只由程式控制而不受物理符號(如回車符)的控制。因此也把這種檔案稱作“流式檔案”。

(2)importdata

importdata根據檔名將資料匯入到Matlab工作區。可以匯入檔案型別有很多,。txt 。wav 等等。匯入的資料(包括字串和數值)以結構形式存放在工作區,可以使用whos命令來檢視工作區的資料。

importdata可以匯入load不能讀取的長短不一的ASCII檔案。當檔案中既包含字串又包含數值,而且數值長度個數不一時,可以使用importdata命令。注意讀取的數值矩陣列數以檔案中數值第一行的列數為標準。

例 test。txt

This is a test。Start01 21212 3 4

執行A=importdata(‘test。txt’)

結果:

A=

data: [4x3 double]textdata: {2x1 cell}

A。data =

0 1 21 2 NaN1 2 34 NaN NaN

A。textdata =

‘This is a test。’‘Start’

另外,讀取的字串只能位於數值之前,位於數值之後的將被忽略。

例:test。txt

01 21212 3 4End。

執行A=importdata(‘test。txt’)

結果:

A=

0 1 21 2 NaN1 2 34 NaN NaN

除了importdata命令以外,還可以從選單選項file——>import data。。。匯入資料檔案,效果和importdata命令一樣。

(3)fopen

fopen開啟一個檔案並建立檔案標識以供接下來的讀寫等操作。fopen命令本身不進行讀操作。然後可以使用fscanf讀取資料,根據需要對資料進行篩選編輯。

例:讀取字串的方法

data。txt

01 212 312 3End。

fid=fopen(‘data。txt’); %開啟檔案,建立檔案標識

A=fscanf(A,‘%c’); %讀取資料

fclose(fid); %關閉檔案標識

i=findstr(A,‘End’); %查詢標識

B=A(1:i-3); %提取資料,換行為2個字元

C=str2num(B); %將資料轉換成數值矩陣

結果:

A=

01 2

12 3

12 3

注意其中str2num同樣需要保證數值矩陣中列數一致,如果不一致,則結果為空。

01 21212 3End。

結果C=[]

例:讀取行的方法

fid1=fopen(‘data。txt’);fid2=fopen(‘numbers。txt’,‘w’);while ~feof(fid1)aline=fgetl(fid1);if double(aline(1))>=48&&double(aline(1))<=57fprintf(fid2,‘%s\n’,aline);continueendend

fclose(fid1);fclose(fid2);

numbers。txt即為按行儲存的數值檔案