1. 程式人生 > >MATLAB字元和字串

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查詢某個字元最先出現的位置