MATLAB字元和字串
3.字元和字串在MATLAB中,幾個字元(Character)可以構一個字串(String)。一個字串被視為一個行向量,而字串中的每一個字元(含空格符),則是以其ASCII的形式存放於此向量的每一個元素中,只是它的外顯形式仍然是可讀的字元。字串型別在資料的視覺化、應用程式的互動方面有著非常重要的作用。3.1 建立字串1.一般字串的建立在MATLAB中,所有的字串都用兩個單引號括起來,進行輸入賦值。如在MATLAB命令視窗中輸入:>> a='matlab’a =matlab字串的每個字元(空格也是字元)都是相應矩陣的一個元素,上述變數a是1×6階的矩陣,可以用size(a)命令查得:>> size(a)ans = 1 6 % 1行6列2.中文字串的建立中文也可以作為字串的內容。但需要注意的是:在中文字串的輸入過程中,兩邊的單引號必須是英文狀態的單引號。例如:>> A='中文字串輸入演示’A =中文字串輸入演示3.字串的尋訪在MATLAB中,字串的尋訪可以通過其座標來實現。在一個字串中,MATLAB按照從左至右的順序對字串中的字元依次編號(1,2,3,…)。進行字串的尋訪,只需要像尋訪一般矩陣那樣即可。例如在前面建立了中文字串A之後可以得到:>> A(3:5)ans =字串4.字串陣列的建立二維字串(陣列)的建立也非常簡單。可以像數值陣列的建立那樣直接輸入,也可以使用str2mat等函式建立。【例3-6】 多行串陣列的直接輸入示例。>> clear>> S=[‘This string array ‘‘has multiple rows.’]S =This string arrayhas multiple rows.>> size(S)ans = 2 18需要注意的是:在直接輸入多行字串陣列的時候,每一行的字元個數必須相同。【例3-7】 使用函式str2mat建立多行串陣列示例。>> a=str2mat(‘這’,‘字元’,‘串陣列’,’’,‘由5 行組成’)a =這 字元 串陣列 由5 行組成>> size(a)ans = 5 6在使用函式str2mat建立字串陣列的時候,不用擔心每一行的字元個數是否相等,函式在執行中會以字元最多的一行為準,而將其他行中的字元以空格補齊。3.2 字串比較在MATLAB中,有多種對字串進行比較的功能:(1)比較兩個字串或者子串是否相等;(2)比較字串中的單個字元是否相等;(3)對字串內的元素分類,判斷每個元素是否是字元或者空格。使用者可以使用下面4個函式中的任意一個,來判斷兩個輸入字串是否相等。(1)strcmp:判斷兩個字串是否相等。(2)strncmp:判斷兩個字串的前n個字元是否相等。(3)strcmpi和strncmpi:這兩個函式的作用分別與strcmp和strncmp相同,只是在比較的過程中忽略了字母大小寫。考慮有這兩個字串:>>str1 = ‘hello’;>>str2 = ‘help’;字串str1和str2並不相等,所以使用strcmp函式來判斷的話,將會返回邏輯0(false)。例如:>>C = strcmp(str1,str2) C = 0由於字串str1和str2的前3個字元相等,所以用strncmp函式來比較前3個以內字元,將會返回邏輯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使用者可以使用關係運算符進行字串的比較,只要比較的陣列具有相同的尺寸,或者其中一個是標量即可。例如,可以使用(==)運算子來判斷兩個字串中有哪些字元相等。>>A = ‘fate’;>>B = ‘cake’;>>A == Bans = 0 1 0 1所有的關係運算符都可以用來比較字串相對應位置上的字元。3.3 字串查詢與替換MATLAB提供了很多函式供使用者進行字串的查詢與替換。更加強大的是,MATLAB也支援在字串的查詢與替換中使用正則表示式。通過靈活使用正則表示式,可以對字串進行各種形式的查詢與替換。至於正則表示式的應用,使用者可以查詢幫助文件中的Regular Expressions部分。【例3-8】 使用strrep函式進行字串查詢替換示例。考慮有這樣一個標籤:>> label = 'Sample 1, 03/28/15’label =Sample 1, 03/28/15函式strrep用於實現一般的查詢與替換功能。本例中使用strrep函式,將日期從"03/28"替換為"03/30"。命令如下:>> newlabel = strrep(label, ‘28’, ‘30’)newlabel =Sample 1, 03/30/15【例3-9】 使用findstr函式進行字串查詢示例。findstr函式用於返回某一子串在整個字串中的開始位置。例如在字串中查詢字母a和oo出現的位置,可以使用如下命令:>> strtemp=‘have a good time!‘strtemp =have a good time!>> position1= findstr(‘a’, strtemp)position1 = 2 6>> position2 = findstr(‘oo’, strtemp)position2 = 9從本例可以看出,字母a出現在第2和第6兩個位置,這說明findstr函式返回的位置資訊包括所有出現的子串的位置。而字母’oo’字串只出現了一次,所以只返回一個位置資訊。strtok 函式用於返回分隔字元第1次出現之前的字元。如果不自行指定分隔字元,預設的分隔字元則是泛空格符字元,因此使用者可以使用strtok函式將一個句子按照單詞分開。【例3-10】 使用strtok函式進行字串查詢示例。>> t=‘I have walked out on a handful ofmovies in my life.’; % 測試字串>> remain = t;>> while true % 使用while迴圈結構[str, remain] = strtok(remain); % 以預設的空格為分隔符查詢if isempty(str), break; end % 迴圈跳出控制disp(sprintf(’%s’, str)) % 顯示結果end以下就是使用strtok函式進行多次查詢得到的結果:Ihavewalkedoutonahandfulofmoviesinmylife.函式strmatch用於查詢一個字元陣列中以指定子串開始的字串,該函式返回的是以指定子串開始的行編號。【例3-11】 使用strmatch函式進行字串查詢示例。
maxstrings = strvcat(‘max’, ‘minimax’,‘maximum’) % 測試字串陣列maxstrings = max minimax maximum>> strmatch(‘max’, maxstrings) % 在測試字串陣列中查詢以max開頭的字串ans = 1 3在本例中第二行minimax雖然也包含max子串,但是這個子串的並不是以max開始的,所以在查詢過程中沒有返回第2行為結果。3.4 型別轉換在MATLAB中允許不同型別的資料和字串型別的資料之間進行轉換,這種轉換需要使用不同的函式完成。另外,同樣的資料,特別是整數資料,有很多種表示的格式,例如十進位制、二進位制或者十六進位制。在C語言中,需要使用printf函式通過相應的格式字串就可以輸出不同格式的資料。而在MATLAB中,則直接提供了相應的函式可以完成數制的轉換。表3-2和表3-3分別列舉了這些函式。表3-2 數字與字串之間的轉換函式函 數說 明函 數說 明num2str將數字轉換為字串str2num將字串轉換為數字int2str將整數轉換為字串sprintf格式化輸出資料到命令列視窗mat2str將矩陣轉換為eval函式可以使用的字串sscanf讀取格式化字串str2double將字串轉換為雙精度型別的資料
表3-3 不同數值之間的轉換函式函 數說 明函 數說 明hex2num將十六進位制整數字符串轉換為雙精度資料dec2bin將十進位制整數轉換為二進位制整數字符串hex2dec將十六進位制整數字符串轉換為十進位制資料base2dec將指定數制型別的數字字串轉換為十進位制整數dec2hex將十進位制資料轉換為十六進位制整數字符串dec2base將十進位制整數轉換為指定數制型別的數字字串bin2dec將二進位制整數字符串轉換為十進位制整數
在表3-2列舉的數字與字串之間的轉換函式中,常用的是num2str和str2num。這兩個函式在MATLAB的圖形使用者介面程式設計中應用較多。【例3-12】 num2str和str2num函式用法例項。>> a=[‘1 2’;‘3 4’] % 建立一個字串陣列a =1 23 4>> b=str2num(a) % 將字串轉換為數值形式b = 1 2 3 4>> c=str2num(‘1+2i’) % 將字串轉換為數值形式c = 1.0000 +2.0000i>> d=str2num(‘1 +2i’) % 將字串轉換為數值形式d = 1.0000 +0.0000i 0.0000 + 2.0000i>>e=num2str(rand(3,3),6) % 將數值轉換為字串形式e =0.814724 0.913376 0.2784980.905792 0.632359 0.5468820.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 本例中轉換生成變數c和d時得到了不同的結果,主要原因是在變數d中,數字 “1”和字元“+2i”之間存在空格,而加號“+”和數字“2”之間沒有空格,所以轉換的結果與生成變數c時不同,建立變數c的時候,在數字“1”、加號“+”和數字“2”之間都存在空格。為了避免出現上述問題,可以使用str2double函式,但是該函式僅能轉換標量,不能轉換矩陣或者陣列。使用num2str函式將數字轉換為字串時,可以指定字串所表示的有效數字位數,詳細資訊可以查閱MATLAB的help文件。3.5 字串應用函式小結MATLAB主要以矩陣計算聞名於世,除此以外該軟體在字串處理方面也提供了一系列非常強大的函式。表3-4對常用字串函式進行了分類小結。表3-4 字串函式函 數說 明字串建立函式’str’由單引號(英文狀態)建立字串blanks建立空格字串sprintf將格式化資料寫入字串strcat字串組合strvcat豎直方向字串組合字串修改函式deblank刪除尾部空格lower將所有字元小寫sort將所有元素升序或降序排列strjust字串對齊strrep字串替換strtrim刪除開始和尾部的泛空格符upper將所有字元大寫字串的讀取和操作eval將一個字串作為MATLAB命令執行sscanf格式讀入字串
續表函 數說 明字串查詢替換函式findstr查詢子串strcmp字串比較strcmpi字串比較,忽略大小寫strmatch查詢符合要求的行strncmp比較字串的前N個字元strncmpi比較字串的前N個字元,忽略大小寫strtok查詢某個字元最先出現的位置