Matlab檔案和資料的匯入與匯出
阿新 • • 發佈:2018-12-20
ref: https://blog.csdn.net/zengzeyu/article/details/72530596
Matlab檔案和資料的匯入與匯出
2017年05月19日 15:18:35 周吳鄭王 閱讀數:740 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],其中R1、C1為讀取區域左上角的行和列,R2、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