版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第6章MATLAB字符串與文件操作6.1字符串與字符串矩陣6.2字符串運(yùn)算6.3字符串操作6.4字符串顯示、打印與格式轉(zhuǎn)換6.5字符串轉(zhuǎn)換6.6字符串的搜索與替換6.7字符串的比較與判斷6.8字符串執(zhí)行與宏6.9文件操作6.1字符串與字符串矩陣
6.1.1字符串的生成
1.字符串
MATLAB具有強(qiáng)大的數(shù)值處理、符號(hào)運(yùn)算和圖形處理能力等,然而在應(yīng)用中也經(jīng)常需要文本操作和文本處理,例如在繪圖時(shí)把標(biāo)號(hào)和標(biāo)題放在圖上等。文件的打開、關(guān)閉等操作都要使用字符串,在MATLAB中,文本當(dāng)做特征字符串或簡(jiǎn)單地當(dāng)做字符串來處理。
MATLAB的字符串是由單引號(hào)括起來的簡(jiǎn)單文本,一個(gè)字符串是存儲(chǔ)在一個(gè)行向量中的文本,這個(gè)行向量中的每一個(gè)元素代表一個(gè)字符。實(shí)際上,元素中存放的是字符的內(nèi)部代碼,也就是ASCII碼。當(dāng)在屏幕上顯示字符變量的值時(shí),顯示出來的是文本,而不是ASCII數(shù)字。由于字符串是以向量的形式來存儲(chǔ)的,因此可以通過它的下標(biāo)對(duì)字符串中的任何一個(gè)元素進(jìn)行訪問。
字符矩陣也是如此,但是它的每行字符數(shù)必須相同。
由于字符串實(shí)際上是ASCII值的數(shù)值數(shù)組,因此可以直接生成字符串,其語法如下:
(1)由單引號(hào)確定賦值。
S=‘AnyCharacters’:產(chǎn)生一個(gè)字符數(shù)組或字符串,S為字符數(shù)組或字符串的名稱,它實(shí)際上是一個(gè)向量,其元素是字符的數(shù)值,S的長(zhǎng)度是所含字符個(gè)數(shù)。如可以使用下面的命令賦值:
>>S=‘Thisisastring!’
S=
Thisisastring!
如果字符串內(nèi)有單引號(hào)出現(xiàn),字符串內(nèi)的單引號(hào)使用兩個(gè)連續(xù)的單引號(hào)來表示。例如:
>>v=‘Ican’‘tfindGREEN!’
v=
Ican'tfindGREEN!字符串中的每個(gè)字符(含空格)都是字符數(shù)組的一個(gè)元素,因此字符串和字符數(shù)組實(shí)際上是等價(jià)的。
>>s2=['matlab_R2010a']
s2=
matlab_R2010a
(2)?S=[S1S2...]:由字符數(shù)組S1、S2…連接生成一個(gè)新的字符數(shù)組S。例如:
>>v='Ican''tfindGREEN!';
>>s2=['matlab_R2010a'];
>>S=[vs2]
S=
Ican'tfindGREEN!matlab_R2010a
MATLAB提供了大量的字符串函數(shù),如表6-1所示。
2.字符串的尺寸
字符串實(shí)際是一個(gè)字符數(shù)組,在字符串里的每個(gè)字符是數(shù)組里的一個(gè)元素。同MATLAB的其他變量一樣,字符串的存儲(chǔ)要求每個(gè)字符8個(gè)字節(jié)。由于ASCII字符只要求一個(gè)字節(jié),7/8所分配的存儲(chǔ)空間沒有使用,故這種存儲(chǔ)要求是很浪費(fèi)的。然而,對(duì)字符串保持同樣的數(shù)據(jù)結(jié)構(gòu),可簡(jiǎn)化MATLAB的內(nèi)部數(shù)據(jù)結(jié)構(gòu)。用size()函數(shù)可測(cè)量字符串的字符數(shù)。例如:
>>t='學(xué)習(xí)MATLAB,非常有用!';
>>size(t)
ans=
114
測(cè)試出字符串t有14個(gè)字符,而whos()函數(shù)可以顯示字符串的詳細(xì)信息,例如:
>>whos
NameSizeBytesClass
t1x1428chararray
用size()函數(shù)測(cè)量出該字符串是一個(gè)1?×?14的數(shù)組,由于中文字符占2個(gè)字節(jié),因此whos()函數(shù)命令會(huì)顯示該數(shù)組占28個(gè)字節(jié)。6.1.2字符串矩陣
在MATLAB中,字符串一般是ASCII值的數(shù)值數(shù)組,它作為字符串表達(dá)式進(jìn)行顯示。與普通數(shù)組一樣,字符串也可以形成矩陣,表現(xiàn)為一個(gè)字符串有多行,但是這些行的列數(shù)必須相同。如果列數(shù)不同,要用空格補(bǔ)齊以使所有行有相同長(zhǎng)度,例如:
>>v=[‘Characterstringshavingmorethan’
‘onerowmusthavethesamenumber’
‘ofcolumnjustlikematrices!’]
v=
Characterstringshavingmorethan
onerowmusthavethesamenumber
ofcolumnjustlikematrices!
1.str2mat()函數(shù)
多個(gè)字符串可以用str2mat()函數(shù)構(gòu)造出字符串矩陣。例如:
>>B=str2mat(S,'MARY','GREEN','BUSH')
B=
Thisisastring!
MARY
GREEN
BUSH
每行有同樣數(shù)目的元素,較短行用空格補(bǔ)齊,使結(jié)果形成一個(gè)有效的矩陣。
2.char()函數(shù)
使用char()函數(shù)可以創(chuàng)建長(zhǎng)度不一致的字符串矩陣。char()函數(shù)自動(dòng)將所有字符串的長(zhǎng)度設(shè)置為輸入字符串中長(zhǎng)度的最大值。語法如下:
(1)?S=char(X):將正整數(shù)數(shù)組X轉(zhuǎn)換為MATLAB字符數(shù)組S,X超出0~65?535范圍的數(shù)值是沒定義的。
(2)?S=char(C):當(dāng)C是串的一個(gè)單元數(shù)組時(shí),將其元素排列為字符數(shù)組的行元素。使用cellstr()函數(shù)可以將其轉(zhuǎn)換回來。
(3)?S=?char(t1,t2,t3,..):生成字符數(shù)組S,它包含按行排列的文本串t1、t2、t3...,每一個(gè)文本參數(shù)ti,可以是一個(gè)字符數(shù)組。char()函數(shù)自動(dòng)將所有字符串的長(zhǎng)度設(shè)置為輸入字符串中長(zhǎng)度的最大值,其余串自動(dòng)用空格填充,這就允許生成任意大小的字符數(shù)組,空串也是合法的。例如:
>>s3=char('M','a','t','l','a','b')
s3=
M
a
t
l
a
b
>>s3'
ans=Matlab
3.列串與strvcat()函數(shù)
strvcat()函數(shù)可生成垂直排列的串,命令格式為strvcat(‘Hello’,‘Yes’),其效果等同于[‘Hello’;‘Yes’]。例如:
>>t1=‘first’;t2=‘string’;t3=‘matrix’;t4=‘second’;
>>S1=strvcat(t1,t2,t3)
S1=
first
string
matrix
>>S2=strvcat(t4,t2,t3)
S2=
second
string
matrix
>>S3=strvcat(S1,S2)
S3=
first
string
matrix
second
string
matrix 6.2字?符?串?運(yùn)?算
由于字符串一般是ASCII值的數(shù)值數(shù)組,因此可以進(jìn)行算術(shù)運(yùn)算。
6.2.1abs()函數(shù)取數(shù)組的絕對(duì)值
最簡(jiǎn)單和計(jì)算上最有效的方法是取數(shù)組的絕對(duì)值。函數(shù)abs(t)將字符串t轉(zhuǎn)換為ASCII值的數(shù)值向量。例如:
>>t='學(xué)習(xí)MATLAB,非常有用!';
>>u=abs(t)
u=23398200647765847665666529238750241202637729992652816.2.2字符串逆轉(zhuǎn)換與setstr()函數(shù)
MATLAB提供了逆轉(zhuǎn)換,可將ASCII值的數(shù)值轉(zhuǎn)換為字符串。
>>v=setstr(u)
v=
學(xué)習(xí)MATLAB,非常有用!6.2.3字符的加法運(yùn)算
字符的加法運(yùn)算實(shí)際上是字符ASCII值的加法。
>>abs('O')
ans=79
>>abs('K')
ans=75
>>'O'+'K'
ans=
154
(1)在上節(jié)的例子里,字符串加零,但ASCII值并不改變,逆轉(zhuǎn)換后仍為原字符串。例如:
>>u0=t+0
u0=
2339820064776584
7665666529238750
24120263772999265281
>>setstr(u0)
ans=
學(xué)習(xí)MATLAB,非常有用!
(2)如果改變了字符串的ASCII值,逆轉(zhuǎn)后已經(jīng)不是原字符串。例如:
>>u1=t+1
u1=
2339920065786685
7766676529338751
24121263782999365282
>>setstr(u1)
ans=
孧鄉(xiāng)NBUMBC-靟帹朊甩"
但在上面的第2個(gè)例子里,加1到字符串改變了它的ASCII值,逆轉(zhuǎn)換后已經(jīng)不是原字符串,這里是亂碼。 6.3字?符?串?操?作
6.3.1字符串尋址、編址與子字符串
字符串可以像數(shù)組一樣進(jìn)行尋址與編址,并生成子字符串。
1.字符串尋址
因?yàn)樽址菙?shù)值數(shù)組,它們可以用MATLAB中所有可利用的數(shù)組操作工具進(jìn)行操作。例如,字符串尋址:
>>u=t(3:end)找出字符串t中,從第3個(gè)字符到字符串結(jié)束的子串。
u=
MATLAB,非常有用!
>>u=t(1:8)
找出字符串t中,從第1個(gè)字符到第8個(gè)字符的子串。
u=
學(xué)習(xí)MATLAB
2.字符串編址
字符串也可以像數(shù)組一樣進(jìn)行編址。這里元素3到8包含單詞MATLAB:
>>u=t(8:-1:3)
u=
BALTAM
這是單詞MATLAB的反向拼寫。6.3.2字符串轉(zhuǎn)置
用轉(zhuǎn)置算子將單詞MATLAB變換成一個(gè)列。例如:
>>u=t(3:8)‘
u=
M
A
T
L
A
B6.3.3字符串的連接
1.直接連接字符串
字符串連接不可以使用加法符號(hào)“+”,但可以直接從數(shù)組連接中得到。例如:
>>t=‘學(xué)習(xí)MATLAB,非常有用!’;
>>s=‘OK,’;
>>ts=[st]
ts=
OK,學(xué)習(xí)MATLAB,非常有用!
2.橫向連接字符串
使用strcat()函數(shù)可以實(shí)現(xiàn)字符串的橫向連接。語法如下:
S=strcat(S1,S2,...):由S1、S2…連接生成一個(gè)新的字符數(shù)組S。S1、S2…,可以是字符數(shù)組或字符串單元數(shù)組,當(dāng)輸入是字符數(shù)組時(shí),輸出也是字符數(shù)組,函數(shù)自動(dòng)刪除尾部的白空格,包括空格、回車、換行、tab和verticaltab等ASCII碼;當(dāng)輸入有字符串的單元數(shù)組時(shí),strcat返回串的單元數(shù)組,函數(shù)不刪除尾部的白空格。
(1)直接連接字符串。例如:
>>st=strcat(s,t)
st=
OK,學(xué)習(xí)MATLAB,非常有用!
>>a=‘hello,’;b=‘goodbye’;c=‘!’;
>>abc=strcat(a,b,c)
abc=
hello,goodbye!
(2)連接單元字符數(shù)組,所有單元數(shù)組的行數(shù)必須相同,對(duì)應(yīng)元素直接連接。例如:
>>a={'abcde','fghi'};b={'jkl','mn'};
>>ab=strcat(a,b)
ab=
'abcdejkl''fghimn'
>>c={'Q'};
>>abc=strcat(a,b,c)
abc=
'abcdejklQ''fghimnQ'
3.縱向連接字符串
使用strvcat()函數(shù)可以實(shí)現(xiàn)字符串的縱向連接。語法如下:
S=strvcat(S1,S2,...):由S1、S2…連接生成一個(gè)新的字符或串的列數(shù)組S。例如:
>>t1=‘first’;t2=‘string’;t3=‘matrix’;t4=‘second’;
>>S1=strvcat(t1,t2,t3)
S1=
first
string
matrix
>>S2=strvcat(t4,t2,t3)
S2=
second
string
matrix
>>S3=strvcat(S1,S2)
S3=
first
string
matrix
second
string
matrix 6.4字符串顯示、打印與格式轉(zhuǎn)換
6.4.1disp()函數(shù)
函數(shù)disp(X)顯示一個(gè)數(shù)組,而不打印數(shù)組名,如果X包含文本串,該串則被顯示。
>>disp('Displaysanarray!')
Displaysanarray!
另一種方法是使用變量顯示,首先使用“X=…”進(jìn)行賦值,然后調(diào)用該變量進(jìn)行顯示,函數(shù)disp(X)允許不打印它的變量名而顯示一個(gè)字符串。例如:
>>u='Displaysanarray!';
>>disp(u)
Displaysanarray!
注意,函數(shù)disp()不顯示一個(gè)空數(shù)組。
6.4.2fprintf()函數(shù)
1.把數(shù)據(jù)寫入文本文件
fprintf()函數(shù)可以把數(shù)據(jù)寫入文本文件,其使用語法如下:
(1)fprintf(fileID,format,A,...):該語句將數(shù)據(jù)A及后面其他參數(shù)中數(shù)字的實(shí)部以format指定的格式寫入到fileID指定的文件中,如果A是矩陣,則包括矩陣中的所有元素。
(2)?fprintf(format,A,...):同上。該語句以format指定的格式顯示。
(3)?count=fprintf(fileID,format,A,...):同上。返回寫入數(shù)據(jù)的字節(jié)數(shù)。
上面語句中,各參數(shù)的意義如下:
(1)?fileID是下列取值之一:
從fopen()函數(shù)獲得的文件標(biāo)識(shí)的整型數(shù)字。
1:輸出到標(biāo)準(zhǔn)輸出設(shè)備(顯示器),該值為默認(rèn),常省略。
2:標(biāo)準(zhǔn)出錯(cuò)信息。圖6-1format參數(shù)的選項(xiàng)
(2)參數(shù)format是由單引號(hào)括起來的,且以%開頭的串,共由五個(gè)部分組成,format參數(shù)的選項(xiàng)如圖6-1所示。
它們分別為:
打頭的“%”與標(biāo)志符:標(biāo)志符包括轉(zhuǎn)換符號(hào)和子類,用于指示輸出的類型和格式,可以選擇的內(nèi)容如表6-2所示。
標(biāo)記(flag):為可選部分,用于控制輸出的對(duì)齊方式,可以選擇的內(nèi)容如表6-3所示。
寬度和精度指示,為可選部分。用戶可以通過數(shù)字指定輸出數(shù)字的寬度及精度,格式如下:
%6f,指定數(shù)字的寬度位數(shù);
%6.2f,指定數(shù)字的寬度及精度;
%.2f,指定數(shù)字的精度。
要打印(顯示)的文本。
結(jié)束符號(hào),為必需部分。包括轉(zhuǎn)義符,轉(zhuǎn)義符用于指定輸出的符號(hào),可以選擇的內(nèi)容如表6-4所示。
例6-4-1
利用fprintf()函數(shù)在顯示器上輸出字符串“It'sFriday.”
解程序如下:
>>fprintf(1,'It''sFriday.\n')
It'sFriday.
在該例中,利用1表示顯示器,格式中用兩個(gè)單引號(hào)顯示一個(gè)單引號(hào),并且使用\n進(jìn)行換行。
>>fprintf('PrintingtheDocumentation!')
PrintingtheDocumentation!>>在上面例子里,fprintf顯示字符串,然后立即給出MATLAB提示符。如果在該例子里,使用“\n”插入一個(gè)換行符,則在MATLAB提示符出現(xiàn)之前創(chuàng)建一個(gè)新行。
>>fprintf('PrintingtheDocumentation!\n')
PrintingtheDocumentation!
>>B=[8.87.7;...
88007700];
fprintf('Xis%4.2fmetersor%8.3fmm\n',9.9,9900,B)
Xis9.90metersor9900.000mm
Xis8.80metersor8800.000mm
Xis7.70metersor7700.000mm
%號(hào)前面的是要顯示的文本,B是矩陣。
2.顯示文本
fprintf()函數(shù)經(jīng)常代替disp()函數(shù)。默認(rèn)情況下,fprintf()函數(shù)把格式化的數(shù)據(jù)寫到當(dāng)前的命令窗口顯示結(jié)果。fprintf()函數(shù)的使用語法如下:
(1)?fprintf(text):fprintf()函數(shù)以默認(rèn)的格式顯示文本text的內(nèi)容。
(2)?fprintf(format,var):var的內(nèi)容以format指定的格式顯示。
>>fprintf('HelloChina!');
顯示結(jié)果:HelloChina!>>
加上換行符號(hào):
>>fprintf('HelloChina!\n');
顯示結(jié)果:HelloChina!6.4.3sprintf()函數(shù)
無論是fprintf()還是sprintf()函數(shù),都以同樣的方式處理輸入?yún)⒘浚玣printf()把輸出送到顯示屏或文件中,而sprintf()則把輸出返回到一個(gè)字符串中。
sprintf()函數(shù)的語法如下:
[s,errmsg]=sprintf(format,A,...)
其中,s是sprintf()輸出返回的字符串,errmsg是出錯(cuò)信息,如果沒有出錯(cuò)信息,則errmsg是一個(gè)空矩陣。format參數(shù)是一個(gè)包含C語言轉(zhuǎn)換特性的串,矩陣A中的數(shù)據(jù)按照format參數(shù)的格式進(jìn)行轉(zhuǎn)換。
%是格式符號(hào)的開始標(biāo)記,其他符號(hào)的意義與fprintf()函數(shù)的意義相同。
例如:
>>p=sprintf('%-8.5g\n',pi);
>>disp(p)
3.1416
>>p=sprintf('%+8.5g\n',pi);
>>disp(p)
+3.1416
>>p=sprintf('%08.5g\n',pi);
>>disp(p)
003.1416
>>t=sprintf('半徑為%4g的圓,其面積為:%4g。',rad,area);
>>disp(t)
半徑為2.5的圓,其面積為19.635。
>>t=sprintf('半徑為%.4g的圓,其面積為:%.4g。',rad,area);
>>disp(t)
半徑為2.5的圓,其面積為19.63。
當(dāng)需要比缺省函數(shù)disp()、num2str()和int2str()所提供的更多的控制時(shí),使用fprintf()和sprintf()是比較方便的。
注意,對(duì)e和f格式,小數(shù)點(diǎn)右邊的十進(jìn)制數(shù)就是小數(shù)點(diǎn)右邊要顯示的多少位數(shù)字。相反,在g的格式里,小數(shù)點(diǎn)右邊的十進(jìn)制數(shù)指定了顯示數(shù)字的總位數(shù)。另外,注意最后的五行,其結(jié)果指定為8個(gè)字符長(zhǎng)度,且是右對(duì)齊。在最后一行,8被忽略,因?yàn)橹付ǔ^了8位。 6.5字?符?串?轉(zhuǎn)?換
6.5.1數(shù)字轉(zhuǎn)換成字符串
函數(shù)int2str()和num2str()把數(shù)值轉(zhuǎn)換成字符、字符串或字符變量,這些函數(shù)是很有用的,例如:
把數(shù)值轉(zhuǎn)換成字符串,作為繪圖的題頭或標(biāo)簽;
字符串連接用來把所轉(zhuǎn)換的數(shù)嵌入到一個(gè)字符串句子中。
1.int2str()函數(shù)將整形數(shù)轉(zhuǎn)換為字符
int2str()函數(shù)將整型數(shù)轉(zhuǎn)換為字符、字符串或字符變量,命令形式如下:
(1)
str=int2str(N):把整型數(shù)值N轉(zhuǎn)換成字符、字符串str,N可以是單個(gè)數(shù)字、向量、數(shù)組、矩陣或表達(dá)式。例如:
>>int2str(2+3)
ans=5
(2)?s=int2str(x):將數(shù)x轉(zhuǎn)換為字符變量s。當(dāng)x是普通有理數(shù)時(shí),將對(duì)其四舍五入后再進(jìn)行轉(zhuǎn)換。當(dāng)x是復(fù)數(shù)時(shí),將只對(duì)其實(shí)部進(jìn)行轉(zhuǎn)換。例如:
>>x1=19;s1=int2str(x1)
s1=19
>>x2=2.4;
>>s2=int2str(x2) %先把變量x2四舍五入,然后再轉(zhuǎn)換為字符型變量s2
s2=2
>>x3=2.9+5*i; %變量x3是復(fù)數(shù),只對(duì)其實(shí)部進(jìn)行轉(zhuǎn)換,對(duì)其四舍五入后再進(jìn)行轉(zhuǎn)換
>>s3=int2str(x3)
s3=3
2.num2str()函數(shù)將數(shù)值轉(zhuǎn)換為字符
num2str()函數(shù)可以將數(shù)值轉(zhuǎn)換為字符、字符串,也可以用于將普通數(shù)值變量轉(zhuǎn)換為字符變量。函數(shù)num2str()的使用方法如下:
(1)?str=num2str(A):轉(zhuǎn)換數(shù)組A為串表達(dá)式str。轉(zhuǎn)換浮點(diǎn)數(shù)的最大精度為4位小數(shù),如果需要可以轉(zhuǎn)換為指數(shù)形式。對(duì)于整型數(shù)值,num2str()返回該值精確的字符串值。
(2)?str=num2str(A,precision):precision指定轉(zhuǎn)換的精度。
(3)?str=num2str(A,format):使用format提供的格式轉(zhuǎn)換數(shù)組A為串表達(dá)式str。與fprintf()函數(shù)類似,默認(rèn)使用“%11.4g”格式,轉(zhuǎn)換浮點(diǎn)數(shù)的最大精度為4位小數(shù),如果需要可以轉(zhuǎn)換為指數(shù)形式。
(4)?s=num2str(x):將普通數(shù)值x轉(zhuǎn)換為字符變量s。規(guī)則是在int2str()命令中對(duì)x的限制則全部取消,這條命令在圖形與圖例的標(biāo)注中非常有用。
無論是num2str()還是int2str()都需調(diào)用函數(shù)sprintf(),它用類似C語言的語法把數(shù)值轉(zhuǎn)換成字符串。例如:
希望把一個(gè)數(shù)值嵌入到字符串中:
>>rad=2.5;area=pi*rad^2;
>>t=['半徑為'num2str(rad)'的圓,其面積為:'num2str(area)'。'];
>>disp(t)
半徑為2.5的圓,其面積為:19.635。
把數(shù)值轉(zhuǎn)換成字符串,作為繪圖的題頭或標(biāo)簽:
>>title(['casenumber'int2str(n)])6.5.2字符串轉(zhuǎn)換成數(shù)字
在字符串轉(zhuǎn)換成數(shù)字的逆方向轉(zhuǎn)換中,使用str2num()函數(shù)是很方便的。串可以是普通的數(shù)字串、小數(shù)串、帶符號(hào)的數(shù)字串、冪或比例因子串,以及復(fù)數(shù)串等。命令形式如下:
x=str2num(s):把字符串變量
s轉(zhuǎn)化為數(shù)值
x。當(dāng)
s是一個(gè)包含非數(shù)字的字符變量時(shí),str2num(s)將返回一個(gè)空矩陣[]。例如:
>>s='123e+5'; %astringcontainingasimplenumber
>>a=str2num(s)
a=12300000
>>class(a)
ans=double
>>s2='12a'; %字符串變量s2包含非數(shù)字的字符變量a
>>x2=str2num(s2)
x2=
[]使用str2num()函數(shù)也可以轉(zhuǎn)換字符矩陣。例如:
>>s='[12;pi4]';%astringofaMATLABmatrix
>>str2num(s)
ans=
1.00002.0000
3.14164.0000
函數(shù)str2num()既不能接受用戶定義的變量,也不能執(zhí)行轉(zhuǎn)換過程的算術(shù)運(yùn)算。6.5.3字符的大小寫轉(zhuǎn)換
下面將舉例說明把一個(gè)字符串轉(zhuǎn)換成大寫的過程。首先,函數(shù)find()找出小寫字符的下標(biāo)值;然后,從小寫元素中減去小寫與大寫之差;最后,用setstr()函數(shù)把求得的數(shù)組轉(zhuǎn)換成它的字符串表示。
>>u='IfYouAreUsingMATLABfortheFirstTime';
>>disp(u)
IfYouAreUsingMATLABfortheFirstTime
>>i=find(u>='a'&u<='z')
i=
Columns1through11
3671011141516172627
Columns12through22
2830313235363738414243
>>u(i)=setstr(u(i)-('a'-'A'))
u=
IFYOUAREUSINGMATLABFORTHEFIRSTTIME
使用upper()、lower()函數(shù)可以直接實(shí)現(xiàn)字符的大小寫轉(zhuǎn)換,例如:
>>u='IfYouAreUsingMATLABfortheFirstTime';
>>U=upper(u)
U=
IFYOUAREUSINGMATLABFORTHEFIRSTTIME
>>lower(U)
ans=
ifyouareusingmatlabforthefirsttime6.6字符串的搜索與替換6.6.1strtok()函數(shù)使用strtok()函數(shù)可以尋找出字符串中由特定字符指定的、第一次出現(xiàn)的標(biāo)記前面的字符,空格是缺省限定字符,其語法如下:
token=strtok('str')
token=strtok('str',delimiter)
[token,rem]=strtok(...)
(1)?token=strtok('str'):使用默認(rèn)的限定符(白空格,包括ASCII9的tab、ASCII13的回車和ASCII32的空格),白空格前面的任何限定符都被忽略。如果str是一個(gè)串的單元數(shù)組,則token是標(biāo)記的單元數(shù)組。例如:
>>s='Thisisasimpleexample.';
>>token=strtok(s)
返回串中第一個(gè)空格前的字符串:
token=
This
(2)?token=strtok('str',delimiter):返回文本串str的第一個(gè)標(biāo)記,向量delimiter使用所有合法的限定符號(hào),delimiter前面的任何限定符都被忽略。
>>token=strtok(s,'a')
返回串中第一個(gè)限定符a前的字符串:
token=
Thisis
>>token=strtok(s,'s')
返回串中第一個(gè)限定符s前的字符串:
token=
Thi
(3)?[token,rem]=strtok(...):返回字符串的剩余部分,如果str是一個(gè)串的單元數(shù)組,則token是標(biāo)記的單元數(shù)組,rem是字符數(shù)組。例如:
>>[token,rem]=strtok(s,'a')
token=
Thisis
rem=
asimpleexample.6.6.2strfind()和findstr()函數(shù)
1.strfind()函數(shù)
使用strfind()函數(shù)在長(zhǎng)字符串s1內(nèi)找出短字符串s2,其語法如下:
k=strfind(str1,str2):findstr()函數(shù)大小寫敏感,在雙精度數(shù)組k中返回每個(gè)子字符串s2出現(xiàn)的開始索引值,如果沒有找到s2或者字符串s2的長(zhǎng)度大于字符串s1則返回空數(shù)組。例如:
>>s='Thisisasimpleexample.';
>>k=strfind(s,'s')
k=
6913
2.findstr()函數(shù)
findstr()函數(shù)用于在一個(gè)字符串s1中查找子字符串s2,返回子字符串的起始位置下標(biāo)值,執(zhí)行時(shí)系統(tǒng)首先判斷兩個(gè)字符串的長(zhǎng)短,然后在長(zhǎng)的字符串中檢索短的子字符串。語法如下:
k=findstr(str1,str2):findstr()函數(shù)大小寫敏感,在雙精度數(shù)組k中返回每個(gè)子字符串s2出現(xiàn)的開始索引值,當(dāng)不匹配時(shí),如果沒有找到則返回空數(shù)組,findstr()函數(shù)對(duì)字符串矩陣不起作用。例如:
>>k=findstr(s,'s')
k=
6913與strfind()函數(shù)不同之處是,findstr()函數(shù)的兩個(gè)輸入?yún)?shù)的次序無關(guān)緊要,這在不知道兩個(gè)輸入串哪個(gè)長(zhǎng)哪個(gè)短的情況下是非常有用的。例如:
>>s='Findthestartingindicesoftheshorterstring.';
>>findstr(s,'the')
ans=
630
>>findstr('the',s)
ans=
630
3.strmatch()函數(shù)
strmatch()函數(shù)在字符數(shù)組的每一行中查找是否存在待查找的字符串,存在則返回1,否則返回0。語法為:
strmatch('str',STRS):查找str中以STRS開頭的字符串。另外,可以用strmatch('str',
STRS,'exact'),查找精確包含STRS的字符串。6.6.3字符串的替換
strrep()函數(shù)執(zhí)行簡(jiǎn)單的字符串替代,用于查找字符串中的子字符串,并將其替換為另一個(gè)子字符串。該函數(shù)對(duì)字符串矩陣不起作用。語法如下:
str=strrep(str1,str2,str3):用串str3替換在串str1中出現(xiàn)的所有字符或字符串str2。例如:
>>b='PeterPiperpickedapeckofpickledpeppers';
>>strrep(b,'p','P')
ans=
PeterPiPerPickedaPeckofPickledPePPers
>>strrep(b,'Peter','Pamela')
ans=
PamelaPiperpickedapeckofpickledpeppers 6.7字符串的比較與判斷
6.7.1字符串的比較
1.strcmp()、strcmpi()函數(shù)使用strcmp()、strcmpi()函數(shù)可進(jìn)行字符串比較,strcmp()函數(shù)對(duì)大小寫敏感,而strcmpi()函數(shù)對(duì)大小寫不敏感。語法如下:
(1)?TF=strcmp('str1','str2'):用于比較兩個(gè)字符串是否相同。比較串str1與str2,如果相同,則TF為1(真);否則為0(假),即str1與str2不相同。當(dāng)所比較的兩個(gè)字符串是單元字符數(shù)組時(shí),返回值為一個(gè)列向量,元素為相應(yīng)行比較的結(jié)果。
(2)?TF=strcmp(‘str’,C):串str與單元矩陣C中的每一個(gè)元素比較,str是一個(gè)字符向量或1?×?1的單元矩陣,C是一個(gè)串單元矩陣。TF是與C的維數(shù)相同的矩陣,如果比較結(jié)果相同則TF中該元素為1(真),否則為0(假)。該函數(shù)要比較的兩個(gè)輸入?yún)?shù)的次序是無關(guān)緊要的,即比較結(jié)果與兩個(gè)輸入?yún)?shù)的次序無關(guān)。
(3)?TF=strcmp(C1,C2):?jiǎn)卧仃嘋1與單元矩陣C2中的每一個(gè)對(duì)應(yīng)元素比較,TF、C1和C2的大小相同。TF是與C1、C2的維數(shù)相同的、元素為邏輯值0、1的矩陣,如果比較結(jié)果相同則TF中該元素為1(真),否則為0(假)。
strcmpi()函數(shù)的使用方法與此相同。例如,比較字符串:
>>strcmp('Yes','No')
ans=
0
>>strcmp('Yes','Yes')
ans=
1
>>strcmp('Yes','yes')
ans=
0
>>strcmpi('Yes','yes')
ans=
1例如,比較單元數(shù)組元素:
>>B={'HandleGraphics','RealTimeWorkshop';
'Toolboxes','TheMathWorks'};
C={'handlegraphics','SignalProcessing';
'Toolboxes','TheMATHWORKS'};
>>TF0=strcmpi('HandleGraphics',C)
TF0=
10
00
>>TF1=strcmpi(B,C)
TF1=
10
01
>>TF2=strcmp(B,C)
TF2=
00
00
2.strncmp()、strncmpi()函數(shù)
使用strncmp()、strncmpi()函數(shù)可進(jìn)行字符串中的前幾個(gè)字符比較,strncmp()函數(shù)對(duì)大小寫敏感,而strncmpi()函數(shù)對(duì)大小寫不敏感。語法如下:
(1)?TF=strncmp('str1','str2',n):串str1的前n個(gè)字符與str2比較,如果相同則TF為1(真),否則為0(假)。當(dāng)所比較的兩個(gè)字符串是單元數(shù)組時(shí),返回值為列向量,元素為相應(yīng)行比較的結(jié)果。
(2)?TF=strncmp('str',C,n):串str的前n個(gè)字符與單元矩陣C中的前n個(gè)元素比較,str是一個(gè)字符向量或1?×?1的單元矩陣,C是一個(gè)串單元矩陣。TF是與C的維數(shù)相同的矩陣,如果比較結(jié)果相同,則TF中該元素為1(真),否則為0(假)。該函數(shù)要比較的兩個(gè)輸入?yún)?shù)的次序是無關(guān)緊要的,即比較結(jié)果與兩個(gè)輸入?yún)?shù)的次序無關(guān)。
(3)?TF=strncmp(C1,C2,n):?jiǎn)卧仃嘋1的前n個(gè)元素與單元矩陣C2中的前n個(gè)元素比較,TF、C1和C2的大小相同。TF是與C1、C2的維數(shù)相同的、元素為邏輯值0、1的矩陣,如果比較結(jié)果相同則TF中該元素為1(真),否則為0(假)。
例如:
>>A='MATLAB',B='MathWorks',C={'handlegraphics','SignalProcessing';
'Toolboxes','TheMATHWORKS'};
>>strncmpi(A,B,3)
ans=
1
>>strncmp(A,B,3)
ans=
0
>>T=strncmpi('HandleGraphics',C,4)
T=
10
00
3.通過簡(jiǎn)單運(yùn)算比較兩個(gè)字符串
除了利用上面4個(gè)函數(shù)進(jìn)行比較之外,還可以通過簡(jiǎn)單運(yùn)算比較兩個(gè)字符串。當(dāng)兩個(gè)字符串擁有相同的維數(shù)時(shí),可以利用MATLAB運(yùn)算法則,對(duì)字符數(shù)組進(jìn)行比較。
字符數(shù)組的比較與數(shù)值數(shù)組的比較基本相同,不同之處在于字符數(shù)組比較時(shí)進(jìn)行比較的是字符的ASCII碼值。進(jìn)行比較返回的結(jié)果為一個(gè)數(shù)值向量,元素為對(duì)應(yīng)字符比較的結(jié)果。需要注意的是,在利用這些運(yùn)算比較字符串時(shí),相互比較的兩個(gè)字符串必須有相同數(shù)目的元素。比較字符串的運(yùn)算符號(hào)和意義如表6-7所示。6.7.2字符串判斷
除上面介紹的兩個(gè)字符串之間的比較之外,MATLAB還可以判斷字符串中的字符是否為空格字符或者字母。實(shí)現(xiàn)這兩個(gè)功能的函數(shù)分別為isspace()和isletter()。
(1)??isspace():用法為isspace(str),判斷字符串str中的字符是否為空格,是空格字符則返回1,否則返回0。
(2)isletter():用法為isletter(str),判斷字符串str中的字符是否為字母,是字母則返回1,否則返回0。 6.8字符串執(zhí)行與宏
6.8.1eval()函數(shù)與字符串求值
函數(shù)eval()提供MATLAB宏的能力,該函數(shù)執(zhí)行由串組成的MATLAB命令表達(dá)式,提供了將用戶創(chuàng)建的函數(shù)名傳給其他函數(shù)的能力,以便求值。相當(dāng)于把字符串中的字符賦予它的實(shí)際內(nèi)容,當(dāng)被求值的字符串是由子字符串連接而成,或?qū)⒆址畟鹘o一個(gè)函數(shù)以求值時(shí),eval非常有用。命令eval使得MATLAB成為一個(gè)可靈活編程的語言,比如這個(gè)命令用來調(diào)用MATLAB中沒有預(yù)定義的函數(shù)。
eval()語法如下:
(1)eval(expression):執(zhí)行MATLAB命令表達(dá)式expression,expression可以由包含在中括號(hào)內(nèi)的子串、變量組成。
expression=[string1,int2str(var),string2,...]
應(yīng)用例子如:
>>d='cd';
>>eval(d);
D:\MyDocuments\MATLAB
>>a=eval('sqrt(2)')
a=
1.4142
>>eval('a=sqrt(2)')
a=
1.4142
(2)?[a1,a2,a3,...]=eval('myfun(b1,b2,b3,...)'):執(zhí)行參數(shù)為b1,b2,b3,...的MATLAB函數(shù)smyfun,并將結(jié)果返回到指定的變量a1,a2,a3,...中。
例6-8-1向MATLAB工作空間加載系列MAT文件August1.mat~August10.mat。程序如下:
ford=1:10
s=['loadAugust'int2str(d)'.mat']
eval(s)
end運(yùn)行結(jié)果是逐個(gè)加載文件,如果該文件保存在當(dāng)前目錄下,就被加載,否則如果該文件沒有保存在當(dāng)前目錄下,或不存在該文件將會(huì)出錯(cuò)。
s=
loadAugust1.mat
s=
loadAugust2.mat
s=
loadAugust3.mat
…例6-8-2在MATLAB工作空間生成系列變量名,并使用eval()函數(shù)為每一個(gè)變量賦值。程序如下:
fork=1:5
t=clock;
pause(uint8(rand*10));
v=genvarname('time_elapsed',who);
eval([v'=etime(clock,t)'])
end運(yùn)行結(jié)果如下:
time_elapsed=9.0620
time_elapsed1=9.0150
time_elapsed2=1
time_elapsed3=9.0160
time_elapsed4=6.0000
如果字符串傳遞到eval()不能被辨認(rèn),MATLAB提供下列語法:
>>eval('a=sqrtt(2)','a=[]')
a=
[]6.8.2feval()函數(shù)
函數(shù)feval()與eval()類似,但在用法上有更多的限制。feval('fun',x)求由字符串“fun”給定的函數(shù)值,其輸入?yún)⒘渴亲兞縳,即feval('fun',x)等價(jià)于求fun(x)值。例如:
>>a=feval('sqrt',2)
a=1.4142
函數(shù)eval()、feval()的基本用途限定在用戶創(chuàng)建的函數(shù)內(nèi)。一般地,feval()可求出有多個(gè)輸入?yún)⒘康暮瘮?shù)值,例如,feval('fun',x,y,z)等價(jià)于求fun(x,y,z)值。例6-8-3在MATLAB工作空間生成3個(gè)函數(shù),用戶選擇一種函數(shù),并輸入自變量值,使用feval()函數(shù)為每一個(gè)變量賦值。程序如下:
fun=['sin';'cos';'log'];
k=input('Choosefunctionnumber:');
x=input('Entervalue:');
feval(fun(k,:),x)
運(yùn)行結(jié)果如下:
Choosefunctionnumber:2
Entervalue:6
ans=0.9602
Choosefunctionnumber:3
Entervalue:6
ans=1.7918
6.9文件操作
6.9.1文件、數(shù)據(jù)的存儲(chǔ)
1.保存整個(gè)工作區(qū)
把MATLAB工作空間中一些有用的數(shù)據(jù)長(zhǎng)久保存下來的方法是生成MAT數(shù)據(jù)文件。
點(diǎn)擊“File”菜單中的“SaveWorkspaceAs…”選項(xiàng),或者點(diǎn)擊工作區(qū)瀏覽器工具欄中的“Save”按鈕,可以將工作區(qū)中的變量保存為MAT文件。
2.保存工作區(qū)中的變量
在工作區(qū)瀏覽器中,右鍵單擊需要保存的變量名,選擇“SaveAs…”菜單項(xiàng),將該變量保存為MAT文件。
3.利用save命令保存
save命令可以保存工作區(qū)或工作區(qū)中任何的指定文件。save命令的調(diào)用格式如下:
(1)?save
filename...:將工作區(qū)中的所有變量保存在當(dāng)前工作區(qū)中的文件中,如果不指定文件名的擴(kuò)展名,則默認(rèn)為MAT文件;如果不指定文件名和擴(kuò)展名,則默認(rèn)文件名為“matlab.mat”,MAT文件可以通過load()函數(shù)再次導(dǎo)入工作區(qū),MAT函數(shù)可以被不同的機(jī)器導(dǎo)入,甚至可以通過其他的程序調(diào)用。例如:
>>savedata:將工作空間中所有的變量存入“data.mat”文件中。
>>savedataab:將工作空間中a和b變量存入“data.mat”文件中。下次運(yùn)行MATLAB時(shí)即可用load指令調(diào)用已生成的MAT文件。
MAT文件是標(biāo)準(zhǔn)的二進(jìn)制文件,還可以ASCII碼形式保存或加載。例如:
>>savedataab–ascii
>>loaddataab–ascii
以二進(jìn)制的方式儲(chǔ)存變量,通常檔案會(huì)比較小,而且在載入時(shí)速度較快,但是無法用普通的文本軟件(例如記事本等)看到檔案內(nèi)容。若想看到檔案內(nèi)容,則必須加上-ascii選項(xiàng)。
>>savefilenamex-ascii:將變量x以八位數(shù)存到名為filename的ASCII檔案。
二進(jìn)制和ASCII檔案的比較:
在save命令使用-ascii選項(xiàng)后,會(huì)有以下現(xiàn)象:
對(duì)于相同的變量,ASCII檔案通常比二進(jìn)制檔案大。
save命令就不會(huì)在檔案名稱后加上MAT的擴(kuò)展名。因此以擴(kuò)展名MAT結(jié)尾的檔案通常是MATLAB的二進(jìn)制資料檔。
通常只儲(chǔ)存一個(gè)變量。若在save命令中加入多個(gè)變量,仍可執(zhí)行,但所產(chǎn)生的檔案則無法以簡(jiǎn)單的load命令載入。參閱有關(guān)load命令的用法。
原有的變量名稱消失。因此在將檔案以load載入時(shí),會(huì)取用檔案名稱為變量名稱。
對(duì)于復(fù)數(shù),只能儲(chǔ)存其實(shí)部,而虛部則會(huì)消失。
若非有特殊需要,我們一般應(yīng)該盡量以二進(jìn)制方式儲(chǔ)存資料。
(2)?save('filename'):將工作區(qū)中的所有變量保存為MAT文件,文件名由字符串filename指定。如果filename中包含路徑,則將文件保存在相應(yīng)目錄下,否則默認(rèn)路徑為當(dāng)前路徑。
(3)?save('filename','var1','var2',...):保存指定的變量在filename指定的文件中。
(4)?save('filename','-struct','s'):保存結(jié)構(gòu)體s中全部域作為單獨(dú)的變量。
(5)?save('filename','-struct','s','f1','f2',...):保存結(jié)構(gòu)體s中的指定變量。
(6)?save('-regexp',expr1,expr2,...):通過正則表達(dá)式指定待保存的變量需滿足的條件。
(7)?save('...,'format'):指定保存文件的格式,格式可以為MAT文件、ASCII文件等。6.9.2數(shù)據(jù)導(dǎo)入
1.函數(shù)load()
在MATLAB中,導(dǎo)入數(shù)據(jù)通常由函數(shù)load()實(shí)現(xiàn),該函數(shù)的用法如下:
(1)?load:如果matlab.mat文件存在,導(dǎo)入matlab.mat中的所有變量,如果不存在,返回error;
(2)?loadfilename:將filename中的全部變量導(dǎo)入到工作區(qū)中;
(3)?loadfilenameXYZ...:將filename中的變量X、Y、Z等導(dǎo)入到工作區(qū)中,如果文件為MAT文件,在指定變量時(shí)可以使用通配符“*”;
(4)?loadfilename-regexpexpr1expr2...:通過正則表達(dá)式指定需要導(dǎo)入的變量;
(5)?load-asciifilename:無論輸入文件名是否包含有擴(kuò)展名,將其以ASCII格式導(dǎo)入,如果指定的文件不是數(shù)字文本,則返回error;
(6)?load-matfilename:無論輸入文件名是否包含有擴(kuò)展名,將其以mat格式導(dǎo)入,如果指定的文件不是MAT文件,則返回error。
2.函數(shù)importdata()
在MATLAB中,另一個(gè)導(dǎo)入數(shù)據(jù)的常用函數(shù)為importdata(),與load()函數(shù)不同,importdata()將文件中的數(shù)據(jù)以結(jié)構(gòu)體的方式導(dǎo)入到工作區(qū)中。該函數(shù)的用法如下:
(1)?importdata('filename'):將filename中的數(shù)據(jù)導(dǎo)入到工作區(qū)中。
(2)?A=importdata('filename'):將filename中的數(shù)據(jù)導(dǎo)入到工作區(qū)中,并保存為變量A。
(3)?importdata('filename','delimiter'):將filename中的數(shù)據(jù)導(dǎo)入到工作區(qū)中,以delimiter指定的符號(hào)作為分隔符。6.9.3文件的打開
在MATLAB中,可以使用open命令打開各種格式的文件,MATLAB自動(dòng)根據(jù)文件的擴(kuò)展名選擇相應(yīng)的編輯器。open()函數(shù)的用法如下:
open('name'):打開一個(gè)名稱由字符串name指定的對(duì)象。打開后采取的具體操作取決于對(duì)象的類型。例如:
>>opencopyfile.m
>>open('D:\temp\data.mat')
需要注意open('filename.mat')和load('filename.mat')的不同,前者將filename.mat以結(jié)構(gòu)體的方式打開在工作區(qū)中,后者將文件中的變量導(dǎo)入到工作區(qū)中,如果要訪問其中的內(nèi)容,則需以不同的格式進(jìn)行。6.9.4文本文件的讀/寫
在上一節(jié)中介紹的函數(shù)和命令主要用于讀/寫mat文件。在實(shí)際應(yīng)用中,經(jīng)常需要讀/寫更多格式的文件,如文本文件(txt)、word文件、xml文件、xls文件及圖像、音/視頻文件等。
在MATLAB中,實(shí)現(xiàn)文本文件讀/寫的函數(shù)如表6-8所示。
1.fscanf()函數(shù)
讀取ASCII文本文件的用法如下:
A=fscanf(fid,format):從fid所指定的文件讀取的所有數(shù)據(jù),將它轉(zhuǎn)換為字符串format指定的格式,并將其返回矩陣A中。參數(shù)fid是整數(shù)型文件標(biāo)識(shí)符,從fopen操作中獲得。
2.csvread()函數(shù)
csvread()函數(shù)讀取逗號(hào)分隔值的文件。用法如下:
(1)?M=csvread('filename'):將文件filename中的數(shù)據(jù)讀入,并且保存為M,filename中只能包含數(shù)字,并且數(shù)字之間以逗號(hào)分隔。M是一個(gè)數(shù)組,行數(shù)與filename的行數(shù)相同,列數(shù)為filename列的最大值,對(duì)于元素不足的行,以0補(bǔ)充。
(2)?M=csvread('filename',row,col):讀取文件filename中的數(shù)據(jù),起始行為row,起始列為col。需要注意的是,此時(shí)的行列從0開始。
(3)?M=csvread('filename',row,col,range):讀取文件filename中的數(shù)據(jù),起始行為row,起始列為col,讀取的數(shù)據(jù)由數(shù)組range指定,range的格式為?[R1C1R2C2],其中,R1、C1為讀取區(qū)域左上角的行和列,R2、C2為讀取區(qū)域右下角的行和列。例如:
csvlist.dat
02,04,06,08,10,12
03,06,09,12,15,18
05,10,15,20,25,30
07,14,21,28,35,42
11,22,33,44,55,66
>>csvread('csvlist.dat')
ans=
24681012
369121518
51015202530
71421283542
112233445566
3.dlmread()函數(shù)
dlmread()函數(shù)讀取以ASCII分隔值的文件。用法如下:
M=dlmread('filename')
M=dlmread('filename',delimiter)
M=dlmread('filename',delimiter,R,C)
M=dlmread('filename',delimiter,range)
其中,參數(shù)delimiter()用于指定文件中的分隔符,其他參數(shù)的意義與csvread()函數(shù)中參數(shù)的意義相同,這里不再贅述。dlmread()函數(shù)與csvread()函數(shù)的差別在于,dlmread()函數(shù)在讀入數(shù)據(jù)時(shí)可以指定分隔符,不指定時(shí)默認(rèn)分隔符為逗號(hào)。
4.dlmwrite()函數(shù)
dlmwrite()函數(shù)將矩陣數(shù)據(jù)寫入以ASCII分隔值的文件中。用法如下:
dlmwrite('filename',M):將矩陣M的數(shù)據(jù)寫入文件filename中,默認(rèn)以逗號(hào)分隔;
dlmwrite('filename',M,'D'):將矩陣M的數(shù)據(jù)寫入文件filename中,采用指定的分隔符D分隔數(shù)據(jù),如果需要tab鍵,可以用“\t”指定;
dlmwrite('filename',M,'D',R,C):指定寫入數(shù)據(jù)的起始位置;
dlmwrite('filename',M,attribute1,value1,attribute2,value2,...):指定任意數(shù)目的參數(shù),可以指定的參數(shù)如表6-9所示;
dlmwrite('filename',M,'-append'):如果filename指定的文件存在,在文件后面寫入數(shù)據(jù),不指定時(shí)則覆蓋原文件。
dlmwrite('filename',M,'-append',attribute-valuelist):敘寫文件,并指定參數(shù)。
dlmwrite():函數(shù)的可用參數(shù)如表6-9所示。
textread、textscan:當(dāng)文件的格式已知時(shí),可以利用textread()函數(shù)和textscan()函數(shù)讀入。6.9.5低層文件I/O操作
1.打開和關(guān)閉文件
打開和關(guān)閉文件分別使用fopen()、fclose()函數(shù)。
(1)?fopen()函數(shù)。語法及功能如下:
fid?=?fopen(filename):打開文件名為filename的文件,用于讀/寫,返回一個(gè)integer類型的文件標(biāo)識(shí)fid。
文件標(biāo)識(shí)符號(hào)fid是一個(gè)整型數(shù)值,MATLAB分別識(shí)別文件標(biāo)識(shí)符fid為0是標(biāo)準(zhǔn)輸入、1是標(biāo)準(zhǔn)輸出(屏幕)和2是標(biāo)準(zhǔn)錯(cuò)誤。如果fopen()函數(shù)打不開文件,fid=-1。如果fopen()函數(shù)打開文件成功,fid大于或等于3。
fid=fopen(filename,permission):permission是一個(gè)字符串,描述訪問的文件類型的字符串:讀取、寫入、追加或更新,指定是以二進(jìn)制或文本模式打開文件。permission的具體內(nèi)容和意義如表6-11所示。
fid=fopen(filename,permission,machineformat):machineformat是一個(gè)串,指定文件以字節(jié)或位讀/寫的次序,用于不同的操作系統(tǒng)。
[fid,message]=fopen(filename,…):message是依賴不同操作系統(tǒng)所提供的出錯(cuò)信息。
fid=fopen('all'):fid是一個(gè)向量,代表所有打開文件的標(biāo)識(shí)。
[filename,permission,machineformat]=fopen(fid):返回所打開文件的各種信息。
(2)?fclose()函數(shù)。
status=fclose(fid):此處的fid的意義與fopen()函數(shù)中的意義相同,即把在fopen()函數(shù)中以文件標(biāo)識(shí)符號(hào)為fid的文件關(guān)閉。
status=fclose('all'):此處的all的意義與fopen()函數(shù)中的意義相同,即把在fopen()函數(shù)中以文件標(biāo)識(shí)符號(hào)為fid的列向量所代表的所有文件關(guān)閉。
例:打開一個(gè)名為std.dat的數(shù)據(jù)文件并進(jìn)行讀操作的命令為
fid=fopen('my.txt','r')
2.文件定位和狀態(tài)
文件定位和狀態(tài)使用feof()、fseek()、ftell()、ferror()、frewind()等函數(shù),使用方法與C語言相同。
3.二進(jìn)制文件的讀/寫
可使用fread()和fwrite()函數(shù)進(jìn)行二進(jìn)制文件的讀/寫。
(1)?fread():從文件中讀取二進(jìn)制數(shù)據(jù)。語法如下:
A=fread(fid)
A=fread(fid,count)
A=fread(fid,count,precision)
A=fread(fid,count,precision,skip)
A=fread(fid,count,precision,skip,machineformat)
[A,count]=fread(...)從fid指定的文件中讀取二進(jìn)制格式數(shù)據(jù)到矩陣A,在調(diào)用fread之前先使用fopen打開文件。參數(shù)fid是整數(shù)型文件標(biāo)識(shí)符,從fopen操作中獲得。MATLAB從頭到尾完整讀取該文件,然后將文件指針定位在文件的末尾。
count是一個(gè)可選項(xiàng),指定讀取的元素?cái)?shù),如果不指定該參數(shù),則讀取整個(gè)文件。字符串precision指定文件所讀取的精度格式,默認(rèn)為無符號(hào)的字符格式uchar。如果包括一個(gè)可選項(xiàng)skip參數(shù),指定讀取每個(gè)precision值后要跳過的字節(jié)數(shù)。如果precision指定一個(gè)位格式,如?'bitN'?或?'ubitN',skip參數(shù)將被解釋為跳過的位數(shù)。例如:
fid=fopen('std.dat','r');
A=fread(fid,100,'long');
Sta=fclose(fid);
以“讀”數(shù)據(jù)形
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年專用版文化藝術(shù)品版權(quán)保護(hù)與授權(quán)合同
- 專業(yè)產(chǎn)品開發(fā)服務(wù)協(xié)議2024年版
- 2025年度餐飲行業(yè)廚師創(chuàng)新研發(fā)勞動(dòng)合同3篇
- 2024年版軟件購(gòu)銷協(xié)議模板細(xì)則版B版
- 2024年采購(gòu)供需協(xié)議
- 2025年度草原防火與應(yīng)急管理服務(wù)合同3篇
- 2024年門窗安裝工程勞務(wù)派遣合同
- 2025年度智慧城市O2O綜合服務(wù)戰(zhàn)略合作協(xié)議書3篇
- 中醫(yī)基本知識(shí)培訓(xùn)課件
- 白酒知識(shí)線上培訓(xùn)課件
- 福建省能化集團(tuán)筆試題目
- 中考英語688高頻詞大綱詞頻表
- 手糊補(bǔ)強(qiáng)工A卷考試 (1)附有答案
- AQL標(biāo)準(zhǔn)抽樣檢驗(yàn)表
- 美國(guó)Control4智能家居設(shè)計(jì)方案解說資料
- DES算法Matlab代碼
- 超市日常工作檢查表
- 交通事故快速處理單(正反打印)
- 電纜熱穩(wěn)定校驗(yàn)計(jì)算書
- 2020國(guó)際大專辯論賽順境或逆境更有利于人的成長(zhǎng)
- 管理制度評(píng)價(jià)表(填寫模板)
評(píng)論
0/150
提交評(píng)論