在編寫一個程序時,經常需要從外部讀入數據,或者將程序運行的結果保存為文件。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 語言的格式,如“.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 %f %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 .2d
2. 寬度和精度指示
用戶可以通過數字指定輸出數字的寬度及精度,格式如下:
● o,指定數字的寬度;
● %6.2f,指定數字的寬度及精度;
● %.2f,指定數字的精度。
例13-6 fprintf函數寬度和精度指示符示例。
在命令窗口中輸入如下命令:
>> file_type = fopen('D:\type.txt','w');
>> fprintf(file_h, '%6.2f .8f\n', 1.2, -43.3);
>> fprintf(file_h, 'o f\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 .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”,選擇待導入的文件,這里我們選擇了一個文本文件,其內容為逗號分隔的數字,打開窗口如圖13-3所示。
想用matlab讀取txt文件,怎么實現
http://zhidao.baidu.com/question/249849169.html?an=0&si=1
輸入輸出方式,即從數據文件讀取數據或將結果寫入數據文件。MATLAB提供了一系列低層輸入輸出函數,專門用於文件操作。
1、文件的打開與關閉
1)打開文件 在讀寫文件之前,必須先用fopen函數打開或創建文件,並指定對該文件進行的操作方式。
fopen函數的調用格式為: fid=fopen(文件名,‘打開方式’)
說明:其中fid用於存儲文件句柄值,如果返回的句柄值大於0,則說明文件打開成功。文件名用字符串形式,表示待打開的數據文件。常見的打開方式如下:
‘r’:只讀方式打開文件(默認的方式),該文件必須已存在。
‘r+’:讀寫方式打開文件,打開后先讀后寫。該文件必須已存在。
‘w’:打開后寫入數據。該文件已存在則更新;不存在則創建。
‘w+’:讀寫方式打開文件。先讀后寫。該文件已存在則更新;不存在則創建。
‘a’:在打開的文件末端添加數據。文件不存在則創建。
‘a+’:打開文件后,先讀入數據再添加數據。文件不存在則創建。
另外,在這些字符串后添加一個“t”,如‘rt’或‘wt+’,則將該文件以文本方式打開;如果添加的是“b”,則以二進制格式打開,這也是fopen函數默認的打開方式。
2)關閉文件 文件在進行完讀、寫等操作后,應及時關閉,以免數據丟失。
關閉文件用fclose函數,調用格式為: sta=fclose(fid)
說明:該函數關閉fid所表示的文件。sta表示關閉文件操作的返回代碼,若關閉成功,返回0,否則返回-1。如果要關閉所有已打開的文件用fclose(‘all’)。
2、二進制文件的讀寫操作
1)寫二進制文件
fwrite函數按照指定的數據精度將矩陣中的元素寫入到文件中。
其調用格式為: COUNT=fwrite(fid,A,precision)
說明:其中COUNT返回所寫的數據元素個數(可缺省),fid為文件句柄,A用來存放寫入文件的數據,precision代表數據精度,常用的數據精度有:char、uchar、int、long、float、double等。缺省數據精度為uchar,即無符號字符格式。
例6.8 將一個二進制矩陣存入磁盤文件中。
>> a=[1 2 3 4 5 6 7 8 9];
>> fid=fopen('d:\test.bin','wb') %以二進制數據寫入方式打開文件 fid = 3 %其值大於0,表示打開成功
>> fwrite(fid,a,'double') ans =9 %表示寫入了9個數據
>> fclose(fid) ans =0 %表示關閉成功
2)讀二進制文件
fread函數可以讀取二進制文件的數據,並將數據存入矩陣。
其調用格式為: [A,COUNT]=fread(fid,size,precision)
說明:其中A是用於存放讀取數據的矩陣、COUNT是返回所讀取的數據元素個數、fid為文件句柄、size為可選項,若不選用則讀取整個文件內容;
若選用則它的值可以是下列值:N(讀取N個元素到一個列向量)、inf(讀取整個文件)、[M,N](讀數據到M×N的矩陣中,數據按列存放)。precision用於控制所寫數據的精度,其形式與fwrite函數相同。
3、文本文件的讀寫操作
1)讀文本文件
fscanf函數可以讀取文本文件的內容,並按指定格式存入矩陣。
其調用格式為: [A,COUNT]=fscanf(fid,format,size)
說明:其中A用來存放讀取的數據,COUNT返回所讀取的數據元素個數,fid為文件句柄,format用來控制讀取的數據格式,由%加上格式符組成,常見的格式符有:d(整型)、f(浮點型)、s(字符串型)、c(字符型)等,在%與格式符之間還可以插入附加格式說明符,如數據寬度說明等。size為可選項,決定矩陣A中數據的排列形式,它可以取下列值:N(讀取N個元素到一個列向量)、inf(讀取整個文件)、[M,N](讀數據到M×N的矩陣中,數據按列存放)。
2)寫文本文件
fprintf函數可以將數據按指定格式寫入到文本文件中。
其調用格式為: fprintf(fid,format,A)
說明:fid為文件句柄,指定要寫入數據的文件,format是用來控制所寫數據格式的格式符,與fscanf函數相同,A是用來存放數據的矩陣。
例6.9 創建一個字符矩陣並存入磁盤,再讀出賦值給另一個矩陣。
>> a='string';
>> fid=fopen('d:\char1.txt','w');
>> fprintf(fid,'%s',a);
>> fclose(fid);
>> fid1=fopen('d:\char1.txt','rt');
>> fid1=fopen('d:\char1.txt','rt');
>> b=fscanf(fid1,'%s') b = string
matlab讀txt文件
fid=fopen('fx.txt','r'); %得到文件號
[f,count]=fscanf(fid,'%f %f',[12,90]); %把文件號1的數據讀到f中。其中f是[12 90]的矩陣 %這里'%f %f'表示讀取數據的形勢,他是按原始數據型讀出
fclose(fid); %關閉文件
另外有的txt文件還可以用load來打開 其語句為 f=load('fx.txt) 我個人覺得用第一種方式較好。因為有些時候,特別是fx.txt 的一行種有多個數據時用load 就比較麻煩了。
matlab如何讀取含有文本的TXT數據文件並存入數組??
http://zhidao.baidu.com/question/139154026.html?fr=qrl&cid=93&index=4
有如下格式的數據文件:
5 jhg jy jyg jh kjh jh kjh
yuyu yu yt uyt uyt uyt uyt uyt
fh jhg jy jyg jh kjh jh kjh
kjh kjh 56 56 21 654 54 354
jh jh 54 6456 654 46 5 21
kjh kjh 12 56 54 -562 21 21
kjh kjh 321 412 654 54 4 23
kjh kjh 646 545 1254 54 21 1
kjh kjh 4 545 632 1 38 32
kjh kjh 21 3 -15 6554 55 63
kjh kjh 21 21 1 13107 3 94
kjh kjh 5 21 2 19660 45 125
kjh kjh 1 3 3 26213 52423 156
kjh kjh -639 -15 4 2 0 187
kjh kjh -319 2 21 21 21 218
kjh kjh 1 2 21 23 25 249
kjh kjh 321 321 21 23 25 280
如何才能讀取該文件4到17行,3到8列的數據,並存入一個數組A中,我的數據文件為TXT文檔:
clc;clear;close all;
hang=[4 17];%4行到17行。這樣你也可以變化
lie=[3 8];%3到8列。這樣你也可以變化
[FileName,PathName] = uigetfile('*.txt','Select the Txt files');%彈出對話框,然后選擇你要處理的文件
fid=fopen([PathName FileName]);
temp=textscan(fid,'%s %s %s %s %s %s %s %s');
fclose(fid);
for i=1:(hang(2)-hang(1)+1)
for j=1:(lie(2)-lie(1)+1)
b=temp{j+lie(1)-1}{i+hang(1)-1};
A(i,j)=str2num(b);
end
end
三維矩陣存入txt文檔
我已得到matlab結果為多個三維數組(224*196*224),但是由於內存限制,故需將這些矩陣先保存到txt 文件中,當需要時再從txt文件中讀取,如何將多個三維矩陣依次存入txt文件中,並讀取呢。
dlmwrite( 'd:\1.txt', A, 'delimiter', '\t','precision', 16);
eo= dlmread('d:\1.txt');
EO=reshape(eo,rows,cols,thirds);