Matlab, 數據, 文件
在編寫一個程序時,常常須要從外部讀入數據,或者將程序運行的結果保存爲文件。MATLAB使用多種格式打開和保存數據。本章將要介紹 MATLAB中文件的讀寫和數據的導入導出。
13.1 數據基本操做
本節介紹基本的數據操做,包括工做區的保存、導入和文件打開。
13.1.1 文件的存儲
MATLAB支持工做區的保存。用戶能夠將工做區或工做區中的變量以文件的形式保存,以備在須要時再次導入。保存工做區能夠經過菜單進行,也能夠經過命令窗口進行。
1. 保存整個工做區
選擇File菜單中的Save Workspace As…命令,或者單擊工做區瀏覽器工具欄中的Save,能夠將工做區中的變量保存爲MAT文件。
2. 保存工做區中的變量
在工做區瀏覽器中,右擊須要保存的變量名,選擇Save As…,將該變量保存爲MAT文件。
3. 利用save命令保存
該命令能夠保存工做區,或工做區中任何指定文件。該命令的調用格式以下:
● save:將工做區中的全部變量保存在當前工做區中的文件中,文件名爲 matlab.mat,MAT文件能夠經過load函數再次導入工做區,MAT函數能夠被不一樣的機器導入,甚至能夠經過其餘的程序調用。
● save('filename'):將工做區中的全部變量保存爲文件,文件名由filename指定。若是filename中包含路徑,則將文件保存在相應目錄下,不然默認路徑爲當前路徑。
● save('filename', 'var1', 'var2', ...):保存指定的變量在 filename 指定的文件中。
● save('filename', '-struct', 's'):保存結構體s中所有域做爲單獨的變量。
● save('filename', '-struct', 's', 'f1', 'f2', ...):保存結構體s中的指定變量。
● save('-regexp', expr1, expr2, ...):經過正則表達式指定待保存的變量需知足的條件。
● save('..., 'format'),指定保存文件的格式,格式能夠爲MAT文件、ASCII文件等。
13.1.2 數據導入
MATLAB中導入數據一般由函數load實現,該函數的用法以下:
● load:若是matlab.mat文件存在,導入matlab.mat中的全部變量,若是不存在,則返回error。
● load filename:將filename中的所有變量導入到工做區中。
● load filename X Y Z ...:將filename中的變量X、Y、Z等導入到工做區中,若是是MAT文件,在指定變量時能夠使用通配符「*」。
● load filename -regexp expr1 expr2 ...:經過正則表達式指定須要導入的變量。
● load -ascii filename:不管輸入文件名是否包含有擴展名,將其以ASCII格式導入;若是指定的文件不是數字文本,則返回error。
● load -mat filename:不管輸入文件名是否包含有擴展名,將其以mat格式導入;若是指定的文件不是MAT文件,則返回error。
例13-1 將文件matlab.map中的變量導入到工做區中。
首先應用命令whos –file查看該文件中的內容:
>> whos -file matlab.mat
Name Size Bytes Class
A 2x3 48 double array
I_q 415x552x3 687240 uint8 array
ans 1x3 24 double array
num_of_cluster 1x1 8 double array
Grand total is 687250 elements using 687320 bytes
將該文件中的變量導入到工做區中:
>> load matlab.mat
該命令執行後,能夠在工做區瀏覽器中看見這些變量,如圖13-1所示。
圖13-1 導入變量後的工做區視圖
接下來用戶能夠訪問這些變量。
>> num_of_cluster
num_of_cluster =
3
MATLAB中,另外一個導入數據的經常使用函數爲importdata,該函數的用法以下:
● importdata('filename'),將filename中的數據導入到工做區中;
● A = importdata('filename'),將filename中的數據導入到工做區中,並保存爲變量A;
● importdata('filename','delimiter'),將filename中的數據導入到工做區中,以delimiter指定的符號做爲分隔符;
例13-2 從文件中導入數據。
>> imported_data = importdata('matlab.mat')
imported_data =
ans: [1.1813 1.0928 1.6534]
A: [2x3 double]
I_q: [415x552x3 uint8]
num_of_cluster: 3
與load函數不一樣,importdata將文件中的數據以結構體的方式導入到工做區中。
13.1.3 文件的打開
MATLAB中能夠使用open命令打開各類格式的文件,MATLAB自動根據文件的擴展名選擇相應的編輯器。
須要注意的是open('filename.mat')和load('filename.mat')的不一樣,前者將filename.mat以結構體的方式打開在工做區中,後者將文件中的變量導入到工做區中,若是須要訪問其中的內容,須要以不一樣的格式進行。
例13-3 open與load的比較。
>> clear
>> A = magic(3);
>> B = rand(3);
>> save
Saving to: matlab.mat
>> clear
>> load('matlab.mat')
>> A
A =
8 1 6
3 5 7
4 9 2
>> B
B =
0.9501 0.4860 0.4565
0.2311 0.8913 0.0185
0.6068 0.7621 0.8214
>> clear
>> open('matlab.mat')
ans =
A: [3x3 double]
B: [3x3 double]
>> struc1=ans;
>> struc1.A
ans =
8 1 6
3 5 7
4 9 2
>> struc1.B
ans =
0.9501 0.4860 0.4565
0.2311 0.8913 0.0185
0.6068 0.7621 0.8214
13.2 文本文件的讀寫
在上一節中介紹的函數和命令主要用於讀寫mat文件,而在應用中,須要讀寫更多格式的文件,如文本文件、word文件、xml文件、xls文件、圖像文件和音視頻文件等。本節介紹文本文件(txt)的讀寫。其餘文件的讀寫,用戶能夠參考MATLAB幫助文檔。
MATLAB中實現文本文件讀寫的函數如表13-1所示。
表13-1 MATLAB中文本文件讀寫函數
函 數
功 能
csvread
讀入以逗號分隔的數據
csvwrite
將數據寫入文件,數據間以逗號分隔
dlmread
將以 ASCII 碼分隔的數值數據讀入到矩陣中
dlmwrite
將矩陣數據寫入到文件中,以 ASCII 分隔
textread
從文本文件中讀入數據,將結果分別保存
textscan
從文本文件中讀入數據,將結果保存爲單元數組
下面詳細介紹這些函數。
1. csvread、csvwrite
csvread函數的調用格式以下:
● M = csvread('filename'),將文件filename中的數據讀入,而且保存爲M,filename中只能包含數字,而且數字之間以逗號分隔。M是一個數組,行數與filename的行數相同,列數爲filename列的最大值,對於元素不足的行,以0補充。
● M = csvread('filename', row, col),讀取文件filename中的數據,起始行爲row,起始列爲col,須要注意的是,此時的行列從0開始。
● M = csvread('filename', row, col, range),讀取文件filename 中的數據,起始行爲 row,起始列爲col,讀取的數據由數組 range 指定,range 的格式爲:[R1 C1 R2 C2],其中R一、C1爲讀取區域左上角的行和列,R二、C2爲讀取區域右下角的行和列。
csvwrite 函數的調用格式以下:
● csvwrite('filename',M),將數組M中的數據保存爲文件filename,數據間以逗號分隔。
● csvwrite('filename',M,row,col),將數組M中的指定數據保存在文件中,數據由參數 row和col指定,保存row和col右下角的數據。
● csvwrite寫入數據時每一行以換行符結束。另外,該函數不返回任何值。
這兩個函數的應用見下面的例子。
例13-4 函數csvread和csvwrite 的應用。
本例首先將MATLAB的圖標轉化爲灰度圖,將數據存儲在文本文件中,再將其部分讀出,顯示爲圖形。
編寫M文件,命名爲immatlab.m,內容爲:
% the example of functions csvread and csvwrite
I_MATLAB= imread('D:\matlab.bmp'); % read in the image
I_MATLAB= rgb2gray(I_matlab); % convert the image to gray image
figure,imshow(I_matlab,'InitialMagnification',100); % show the image
csvwrite('D:\matlab.txt',I_matlab); % write the data into a text file
sub_MATLAB= csvread('D:\matlab.txt',100,100);% read in part of the data
sub_MATLAB= uint8(sub_matlab); % convert the data to uint8
figure,imshow(sub_matlab,'InitialMagnification',100); % show the new image
在命令窗口中運行該腳本,輸出圖形如圖13-2所示。
(a) (b)
圖13-2 例13-3 的運行結果
該例中涉及到了少許的圖像處理內容,超出本書的範圍,感興趣的讀者能夠查閱 MATLAB幫助文檔中關於Image Processing Toolbox的介紹。
2. dlmread、dlmwrite(我的以爲這個比較好用)
dlmread函數用於從文檔中讀入數據,其功能強於csvread。dlmread的調用格式以下:
● M = dlmread('filename')
● M = dlmread('filename', delimiter)
● M = dlmread('filename', delimiter, R, C)
● M = dlmread('filename', delimiter, range)
其中參數delimiter用於指定文件中的分隔符,其餘參數的意義與csvread函數中參數的意義相同,這裏再也不贅述。dlmread函數與csvread函數的差異在於,dlmread函數在讀入數據時能夠指定分隔符,不指定時默認分隔符爲逗號。
dlmwrite函數用於向文檔中寫入數據,其功能強於csvwrite函數。dlmwrite函數的調用格式爲:
● dlmwrite('filename', M),將矩陣M的數據寫入文件filename中,以逗號分隔。
● dlmwrite('filename', M, 'D'),將矩陣M的數據寫入文件filename中,採用指定的分隔符分隔數據,若是須要tab鍵,能夠用「\t」指定。
● dlmwrite('filename', M, 'D', R, C),指定寫入數據的起始位置。
● dlmwrite('filename', M, attribute1, value1, attribute2, value2, ...),指定任意數目的參數,能夠指定的參數見下表。
● dlmwrite('filename', M, '-append'),若是filename指定的文件存在,在文件後面寫入數據,不指定時則覆蓋原文件。
● dlmwrite('filename', M, '-append', attribute-value list),敘寫文件,並指定參數。
● dlmwrite 函數的可用參數如表13-2所示。
表13-2 dlmwrite函數的可用參數
參 數 名
功 能
delimiter
用於指定分隔符
newline
用於指定換行符,能夠選擇「pc」或者「unix」
roffset
行誤差,指定文件第一行的位置,roffset 的基數爲 0
coffset
列誤差,指定文件第一列的位置,coffset 的基數爲 0
precision
指定精確度,能夠指定精確維數,或者採用 c 語言的格式,如「%10.5f」
3. textread,textscan
當文件的格式已知時,能夠利用textread函數和textscan函數讀入。這裏只介紹這兩個函數應用的實例。
例13-5 經過%讀入文件,按照原有格式讀取。
文件的內容爲:
Sally Level1 12.34 45 Yes
在命令窗口中輸入:
>> [names, types, x, y, answer] = textread('D:\mat.txt','%s %s %f %d %s', 1)
獲得結果爲:
names =
'Sally'
types =
'Level1'
x =
12.3400
y =
45
answer =
'Yes'
例13-6 函數csvread和csvwrite的應用
Sally Level1 12.34 45 1.23e10 inf NaN Yes
Joe Level2 23.54 60 9e19 -inf 0.001 No
Bill Level3 34.90 12 2e5 10 100 No
>> fid = fopen('D:\mat.txt');
>> C = textscan(fid, '%s %s %f32 %d8 %u %f %f %s');
>> fclose(fid);
13.3 低級文件I/O
本節介紹一些基本的文件操做,這些操做如表13-3所示。
表13-3 MATLAB的基本文件操做
函 數
功 能
fclose
關閉打開的文件
feof
判斷是否爲文件結尾
ferror
文件輸入輸出中的錯誤查找
fgetl
讀入一行,忽略換行符
fgets
讀入一行,直到換行符
fopen
打開文件,或者獲取打開文件的信息
fprintf
格式化輸入數據到文件
fread
從文件中讀取二進制數據
frewind
將文件的位置指針移至文件開頭位置
fscanf
格式化讀入
fseek
設置文件位置指針
ftell
文件位置指針
fwrite
向文件中寫入數據
下面重點介紹函數fprintf。該函數的調用格式以下:
count = fprintf(fid, format, A, ...),該語句將矩陣A及後面其餘參數中數字的實部以 format 指定的格式寫入到fid指定的文件中,返回寫入數據的字節數。
上面語句中,參數format由%開頭,共可由4個部分組成,分別以下:
● 標記(flag),爲可選部分。
● 寬度和精度指示,爲可選部分。
● 類型標誌符,爲可選部分。
● 轉換字符,爲必需部分。
1. 標記
標記用於控制輸出的對齊方式,能夠選擇的內容如表13-4所示。
表13-4 標記的可選內容
函 數
功 能
示 例
負號(-)
在參數左側進行判別
%-5.2d
加號(+)
在數字前添加符號
%+5.2d
空格
在數字前插入空格
% 5.2d
0
在數字前插入0
%05.2d
2. 寬度和精度指示
用戶能夠經過數字指定輸出數字的寬度及精度,格式以下:
● %6f,指定數字的寬度;
● %6.2f,指定數字的寬度及精度;
● %.2f,指定數字的精度。
例13-6 fprintf函數寬度和精度指示符示例。
在命令窗口中輸入以下命令:
>> file_type = fopen('D:\type.txt','w');
>> fprintf(file_h, '%6.2f %12.8f\n', 1.2, -43.3);
>> fprintf(file_h, '%6f %12f\n', 1.2, -43.3);
>> fprintf(file_h, '%.2f %.8f\n', 1.2, -43.3);
>> fclose(file_h)
ans =
0
打開該文件,其內容爲:
1.20 -43.30000000
1.200000 -43.300000
1.20 -43.30000000
從上述結果能夠看出寬度和精度控制的效果。
3. 轉換字符
轉換字符用於指定輸出的符號,能夠選擇的內容如表13-5所示。
表13-5 格式化輸出的標誌符及意義
標 志 符
意 義
%c
輸出單個字符
%d
輸出有符號十進制數
%e
採用指數格式輸出,採用小寫字母 e,如:3.1415e+00
(續表)
標 志 符
意 義
%E
採用指數格式輸出,採用大寫字母 E,如:3.1415E+00
%f
以定點數的格式輸出
%g
%e及%f的更緊湊的格式,不顯示數字中無效的 0
%G
與%g相同,可是使用大寫字母E
%i
有符號十進制數
%o
無符號八進制數
%s
輸出字符串
%u
無符號十進制數
%x
十六進制數(使用小寫字母a-f)
%X
十六進制數(使用大寫字母A-F)
其中 %o、%u、%x、%X支持使用子類型,具體狀況這裏再也不贅述。格式化輸出標誌符的效果見下面的例子。
例13-7 fprintf 格式化輸出示例。
>> x = 0:.1:1;
>> y = [x; exp(x)];
>> fid = fopen('exp.txt', 'wt');
>> fprintf(fid, '%6.2f %12.8f\n', y);
>> fclose(fid)
ans =
0
顯示該文件:
>> type exp.txt
0.00 1.00000000
0.10 1.10517092
…
0.90 2.45960311
1.00 2.71828183
例13-9 利用 fprintf 函數在顯示器上輸出字符串
>> fprintf(1,'It''s Friday.\n')
It's Friday.
在該例中,利用1表示顯示器,而且用兩個單引號顯示單引號,使用\n進行換行。在格式化輸出中,這類符號稱爲轉義符。MATLAB中的經常使用轉義符如表13-6所示。
表13-6 MATLAB中的經常使用轉義符
轉 義 符
功 能
\b
退格
\f
表格填充
\n
換行符
\r
回車
\t
tab
\\
\,反斜線
\'' 或 ''
',單引號
%%
%,百分號
13.4 利用界面工具導入數據
除前面幾節介紹的函數外,也能夠經過界面工具將數據導入到工做區中。本節介紹利用工做區瀏覽器中的工具導入數據。
選擇工做區瀏覽器工具欄中的「Import Data」,選擇待導入的文件,這裏咱們選擇了一個文本文件,其內容爲逗號分隔的數字.正則表達式
轉自:http://www.360doc.com/content/13/0425/08/11839980_280759953.shtml數組