《MATLAB程序設(shè)計(jì)基礎(chǔ)教程》課件第6章_第1頁(yè)
《MATLAB程序設(shè)計(jì)基礎(chǔ)教程》課件第6章_第2頁(yè)
《MATLAB程序設(shè)計(jì)基礎(chǔ)教程》課件第6章_第3頁(yè)
《MATLAB程序設(shè)計(jì)基礎(chǔ)教程》課件第6章_第4頁(yè)
《MATLAB程序設(shè)計(jì)基礎(chǔ)教程》課件第6章_第5頁(yè)
已閱讀5頁(yè),還剩125頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論