3.字符和字符串 在MATLAB中,幾個(gè)字符(Character)可以構(gòu)一個(gè)字符串(String)。一個(gè)字符串被視為一個(gè)行向量,而字符串中的每一個(gè)字符(含空格符),則是以其ASCII的形式存放于此向量的每一個(gè)元素中,只是它的外顯形式仍然是可讀的字符。字符串類型在數(shù)據(jù)的可視化、應(yīng)用程序的交互方面有著非常重要的作用。 3.1 創(chuàng)建字符串 1.一般字符串的創(chuàng)建 在MATLAB中,所有的字符串都用兩個(gè)單引號(hào)括起來(lái),進(jìn)行輸入賦值。如在MATLAB命令窗口中輸入: >> a='matlab' a = matlab 字符串的每個(gè)字符(空格也是字符)都是相應(yīng)矩陣的一個(gè)元素,上述變量a是1×6階的矩陣,可以用size(a)命令查得: >> size(a) ans = 1 6 % 1行6列 2.中文字符串的創(chuàng)建 中文也可以作為字符串的內(nèi)容。但需要注意的是:在中文字符串的輸入過(guò)程中,兩邊的單引號(hào)必須是英文狀態(tài)的單引號(hào)。例如: >> A='中文字符串輸入演示' A = 中文字符串輸入演示 3.字符串的尋訪 在MATLAB中,字符串的尋訪可以通過(guò)其坐標(biāo)來(lái)實(shí)現(xiàn)。在一個(gè)字符串中,MATLAB按照從左至右的順序?qū)ψ址械淖址来尉幪?hào)(1,2,3,…)。進(jìn)行字符串的尋訪,只需要像尋訪一般矩陣那樣即可。例如在前面創(chuàng)建了中文字符串A之后可以得到: >> A(3:5) ans = 字符串 4.字符串?dāng)?shù)組的創(chuàng)建 二維字符串(數(shù)組)的建立也非常簡(jiǎn)單。可以像數(shù)值數(shù)組的建立那樣直接輸入,也可以使用str2mat等函數(shù)建立。 【例3-6】 多行串?dāng)?shù)組的直接輸入示例。 >> clear >> S=['This string array ' 'has multiple rows.'] S = This string array has multiple rows. >> size(S) ans = 2 18 需要注意的是:在直接輸入多行字符串?dāng)?shù)組的時(shí)候,每一行的字符個(gè)數(shù)必須相同。 【例3-7】 使用函數(shù)str2mat創(chuàng)建多行串?dāng)?shù)組示例。 >> a=str2mat('這','字符','串?dāng)?shù)組','','由5 行組成') a = 這 字符 串?dāng)?shù)組
由5 行組成 >> size(a) ans = 5 6 在使用函數(shù)str2mat創(chuàng)建字符串?dāng)?shù)組的時(shí)候,不用擔(dān)心每一行的字符個(gè)數(shù)是否相等,函數(shù)在運(yùn)行中會(huì)以字符最多的一行為準(zhǔn),而將其他行中的字符以空格補(bǔ)齊。 3.2 字符串比較 在MATLAB中,有多種對(duì)字符串進(jìn)行比較的功能: (1)比較兩個(gè)字符串或者子串是否相等; (2)比較字符串中的單個(gè)字符是否相等; (3)對(duì)字符串內(nèi)的元素分類,判斷每個(gè)元素是否是字符或者空格。 用戶可以使用下面4個(gè)函數(shù)中的任意一個(gè),來(lái)判斷兩個(gè)輸入字符串是否相等。 (1)strcmp:判斷兩個(gè)字符串是否相等。 (2)strncmp:判斷兩個(gè)字符串的前n個(gè)字符是否相等。 (3)strcmpi和strncmpi:這兩個(gè)函數(shù)的作用分別與strcmp和strncmp相同,只是在比較的過(guò)程中忽略了字母大小寫。 考慮有這兩個(gè)字符串: >>str1 = 'hello'; >>str2 = 'help'; 字符串str1和str2并不相等,所以使用strcmp函數(shù)來(lái)判斷的話,將會(huì)返回邏輯0(false)。例如: >>C = strcmp(str1,str2) C = 0 由于字符串str1和str2的前3個(gè)字符相等,所以用strncmp函數(shù)來(lái)比較前3個(gè)以內(nèi)字符,將會(huì)返回邏輯1(true)。例如: >>C = strncmp(str1, str2, 2) % 比較前兩個(gè)字符 C = 1 下面介紹如何對(duì)大小寫不同的情況進(jìn)行比較。 >> str3 = 'Hello'; >> D = strncmp(str1, str3,2) % 對(duì)大小寫敏感 D = 0 >> F = strncmpi(str1, str3,2) % 對(duì)大小寫不敏感 F = 1 用戶可以使用關(guān)系運(yùn)算符進(jìn)行字符串的比較,只要比較的數(shù)組具有相同的尺寸,或者其中一個(gè)是標(biāo)量即可。例如,可以使用(==)運(yùn)算符來(lái)判斷兩個(gè)字符串中有哪些字符相等。 >>A = 'fate'; >>B = 'cake'; >>A == B ans = 0 1 0 1 所有的關(guān)系運(yùn)算符都可以用來(lái)比較字符串相對(duì)應(yīng)位置上的字符。 3.3 字符串查找與替換 MATLAB提供了很多函數(shù)供用戶進(jìn)行字符串的查找與替換。更加強(qiáng)大的是,MATLAB也支持在字符串的查找與替換中使用正則表達(dá)式。通過(guò)靈活使用正則表達(dá)式,可以對(duì)字符串進(jìn)行各種形式的查找與替換。至于正則表達(dá)式的應(yīng)用,用戶可以查詢幫助文檔中的Regular Expressions部分。 【例3-8】 使用strrep函數(shù)進(jìn)行字符串查找替換示例。 考慮有這樣一個(gè)標(biāo)簽: >> label = 'Sample 1, 03/28/15' label = Sample 1, 03/28/15 函數(shù)strrep用于實(shí)現(xiàn)一般的查找與替換功能。本例中使用strrep函數(shù),將日期從'03/28'替換為'03/30'。命令如下: >> newlabel = strrep(label, '28', '30') newlabel = Sample 1, 03/30/15 【例3-9】 使用findstr函數(shù)進(jìn)行字符串查找示例。 findstr函數(shù)用于返回某一子串在整個(gè)字符串中的開始位置。例如在字符串中查找字母a和oo出現(xiàn)的位置,可以使用如下命令: >> strtemp='have a good time!' strtemp = have a good time! >> position1= findstr('a', strtemp) position1 = 2 6 >> position2 = findstr('oo', strtemp) position2 = 9 從本例可以看出,字母a出現(xiàn)在第2和第6兩個(gè)位置,這說(shuō)明findstr函數(shù)返回的位置信息包括所有出現(xiàn)的子串的位置。而字母'oo'字串只出現(xiàn)了一次,所以只返回一個(gè)位置信息。 strtok 函數(shù)用于返回分隔字符第1次出現(xiàn)之前的字符。如果不自行指定分隔字符,默認(rèn)的分隔字符則是泛空格符字符,因此用戶可以使用strtok函數(shù)將一個(gè)句子按照單詞分開。 【例3-10】 使用strtok函數(shù)進(jìn)行字符串查找示例。 >> t='I have walked out on a handful ofmovies in my life.'; % 測(cè)試字符串 >> remain = t; >> while true % 使用while循環(huán)結(jié)構(gòu) [str, remain] = strtok(remain); % 以默認(rèn)的空格為分隔符查找 if isempty(str), break; end % 循環(huán)跳出控制 disp(sprintf('%s', str)) % 顯示結(jié)果 end 以下就是使用strtok函數(shù)進(jìn)行多次查找得到的結(jié)果: I have walked out on a handful of movies in my life. 函數(shù)strmatch用于查找一個(gè)字符數(shù)組中以指定子串開始的字符串,該函數(shù)返回的是以指定子串開始的行編號(hào)。 【例3-11】 使用strmatch函數(shù)進(jìn)行字符串查找示例。 >> maxstrings = strvcat('max', 'minimax','maximum') % 測(cè)試字符串?dāng)?shù)組 maxstrings = max minimax maximum >> strmatch('max', maxstrings) % 在測(cè)試字符串?dāng)?shù)組中查找以max開頭的字符串 ans = 1 3 在本例中第二行minimax雖然也包含max子串,但是這個(gè)子串的并不是以max開始的,所以在查找過(guò)程中沒有返回第2行為結(jié)果。 3.4 類型轉(zhuǎn)換 在MATLAB中允許不同類型的數(shù)據(jù)和字符串類型的數(shù)據(jù)之間進(jìn)行轉(zhuǎn)換,這種轉(zhuǎn)換需要使用不同的函數(shù)完成。另外,同樣的數(shù)據(jù),特別是整數(shù)數(shù)據(jù),有很多種表示的格式,例如十進(jìn)制、二進(jìn)制或者十六進(jìn)制。在C語(yǔ)言中,需要使用printf函數(shù)通過(guò)相應(yīng)的格式字符串就可以輸出不同格式的數(shù)據(jù)。而在MATLAB中,則直接提供了相應(yīng)的函數(shù)可以完成數(shù)制的轉(zhuǎn)換。表3-2和表3-3分別列舉了這些函數(shù)。 表3-2 數(shù)字與字符串之間的轉(zhuǎn)換函數(shù)
表3-3 不同數(shù)值之間的轉(zhuǎn)換函數(shù)
在表3-2列舉的數(shù)字與字符串之間的轉(zhuǎn)換函數(shù)中,常用的是num2str和str2num。這兩個(gè)函數(shù)在MATLAB的圖形用戶界面編程中應(yīng)用較多。 【例3-12】 num2str和str2num函數(shù)用法實(shí)例。 >> a=['1 2';'3 4'] % 創(chuàng)建一個(gè)字符串?dāng)?shù)組 a = 1 2 3 4 >> b=str2num(a) % 將字符串轉(zhuǎn)換為數(shù)值形式 b = 1 2 3 4 >> c=str2num('1+2i') % 將字符串轉(zhuǎn)換為數(shù)值形式 c = 1.0000 +2.0000i >> d=str2num('1 +2i') % 將字符串轉(zhuǎn)換為數(shù)值形式 d = 1.0000 +0.0000i 0.0000 + 2.0000i>>e=num2str(rand(3,3),6) % 將數(shù)值轉(zhuǎn)換為字符串形式 e = 0.814724 0.913376 0.278498 0.905792 0.632359 0.546882 0.126987 0.0975404 0.957507 >> whos Name Size Bytes Class Attributes a 2x3 12 char b 2x2 32 double c 1x1 16 double complex d 1x2 32 double complex e 3x35 210 char 本例中轉(zhuǎn)換生成變量c和d時(shí)得到了不同的結(jié)果,主要原因是在變量d中,數(shù)字 “1”和字符“+2i”之間存在空格,而加號(hào)“+”和數(shù)字“2”之間沒有空格,所以轉(zhuǎn)換的結(jié)果與生成變量c時(shí)不同,創(chuàng)建變量c的時(shí)候,在數(shù)字“1”、加號(hào)“+”和數(shù)字“2”之間都存在空格。為了避免出現(xiàn)上述問(wèn)題,可以使用str2double函數(shù),但是該函數(shù)僅能轉(zhuǎn)換標(biāo)量,不能轉(zhuǎn)換矩陣或者數(shù)組。 使用num2str函數(shù)將數(shù)字轉(zhuǎn)換為字符串時(shí),可以指定字符串所表示的有效數(shù)字位數(shù),詳細(xì)信息可以查閱MATLAB的help文檔。 3.5 字符串應(yīng)用函數(shù)小結(jié) MATLAB主要以矩陣計(jì)算聞名于世,除此以外該軟件在字符串處理方面也提供了一系列非常強(qiáng)大的函數(shù)。表3-4對(duì)常用字符串函數(shù)進(jìn)行了分類小結(jié)。 表3-4 字符串函數(shù)
續(xù)表
|
|
來(lái)自: goandlove > 《數(shù)學(xué)》