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