22
2009/10/27 1 第第第 : 第第第第第 第第第 [email protected] http://www.cs.nthu.edu.tw/~ja ng 第第第第第 第第 第第第第第

2009/10/271 第十章 : 字元與字串 張智星 [email protected] jang 清大資工系 多媒體檢索實驗室

  • View
    233

  • Download
    4

Embed Size (px)

Citation preview

Page 1: 2009/10/271 第十章 : 字元與字串 張智星 jang@cs.nthu.edu.tw jang 清大資工系 多媒體檢索實驗室

2009/10/27 1

第十章 : 字元與字串

張智星[email protected]

http://www.cs.nthu.edu.tw/~jang清大資工系 多媒體檢索實驗室

Page 2: 2009/10/271 第十章 : 字元與字串 張智星 jang@cs.nthu.edu.tw jang 清大資工系 多媒體檢索實驗室

2009/10/27 2

本章簡介 本章介紹 MATLAB 用於處理字元( Characte

rs )與字串( Strings )的指令及相關資料型態。 MATLAB 處理字串的相關指令大部分都放在下列目錄之中:

{MATLAB 根目錄 }\toolbox\matlab\strfun 其中的「 strfun 」就是代表「 String Functio

ns 」。若要查詢與字元和字串相關的指令,可在 MATLAB 下輸入:

help strfun 或是 help strings

Page 3: 2009/10/271 第十章 : 字元與字串 張智星 jang@cs.nthu.edu.tw jang 清大資工系 多媒體檢索實驗室

2009/10/27 3

10-1 字元與字串的基本概念 數個字元( Characters )可以構成一個

字串( Strings ) 一個字串是被視為一個列向量( Row Ve

ctor )進行儲存 此一字串中的每一字元(含空白字元),

是以其 ASCII 碼的形式存放於此列向量中的每一個元素( Element )

Page 4: 2009/10/271 第十章 : 字元與字串 張智星 jang@cs.nthu.edu.tw jang 清大資工系 多媒體檢索實驗室

2009/10/27 4

字元與字串的基本概念 Matlab 用「單引號」來界定字串變數,多個字

串變數可直接並排,以得到一個新字串變數,例如:

範例 10-2: string102.m

str3 =I like MATLAB, JavaScript, and Perl!

str1 = 'I like MATLAB,'; % 建立字串變數 str1str2 = ' JavaScript, and Perl!'; % 建立字串變數 str2str3 = [str1 str2] % 直接並排 str1 及 str2 ,以建立 str3

Page 5: 2009/10/271 第十章 : 字元與字串 張智星 jang@cs.nthu.edu.tw jang 清大資工系 多媒體檢索實驗室

2009/10/27 5

字元與字串的基本概念 欲輸入含有單引號的字串,可重覆單引號的使

用 若要計算字串變數的長度(即組成字元的個

數),可用 length 指令 範例 10-4: string104.m

ans = 16

sentence = 'I''ve got a date!';length(sentence) % 計算字串變數 sentence 的長度

Page 6: 2009/10/271 第十章 : 字元與字串 張智星 jang@cs.nthu.edu.tw jang 清大資工系 多媒體檢索實驗室

2009/10/27 6

字串和其 ASCII code double 指令 : 檢視字串變數的儲存內容(即 ASCII 內碼) char 指令 : 將 ASCII 內碼轉回字串形式 範例 10-6: string106.m

phraseascii = Columns 1 through 12

73 39 118 101 32 103 111 116 32 97 32 100Columns 13 through 16 97 116 101 33 sentence2 =I've got a date!

sentence = 'I''ve got a date!';sentenceAscii = double(sentence); % 檢視 sentence 的 ASCII 碼sentence2 = char(sentenceAscii) % 將 ASCII 碼轉回字串形式

Page 7: 2009/10/271 第十章 : 字元與字串 張智星 jang@cs.nthu.edu.tw jang 清大資工系 多媒體檢索實驗室

2009/10/27 7

ASCII 碼對照表 (1/3)ASCII, American Standard Code for Information Interchange 念起來像是 " 阿斯 key" ,定義從 0 到 127 的一百二十八個數字所代表的英文字母或數字或符號,所有使用 ASCII 的電腦之間可以互相讀取同一份文件而不會有不一樣的結果與意義。由於只使用 7 個位元 (bit) 就可以表示從 0 到 127 的數字,大部分的電腦都使用 8 個位元來存取字元集 (character set) ,所以從 128 到 255 之間的數字可以用來代表另一組一百二十八個符號,稱為 extended ASCII 。

Page 8: 2009/10/271 第十章 : 字元與字串 張智星 jang@cs.nthu.edu.tw jang 清大資工系 多媒體檢索實驗室

2009/10/27 8

ASCII 碼對照表 (2/3) ASCII 碼 鍵盤 ASCII 碼 鍵盤 ASCII 碼 鍵盤 ASCII 碼 鍵盤

27 ESC 32 SPACE 33 ! 34 "

35 # 36 $ 37 % 38 &

39 ' 40 ( 41 ) 42 *

43 + 44 ' 45 - 46 .

47 / 48 0 49 1 50 2

51 3 52 4 53 5 54 6

55 7 56 8 57 9 58 :

59 ; 60 < 61 = 62 >

63 ? 64 @ 65 A 66 B

67 C 68 D 69 E 70 F

71 G 72 H 73 I 74 J

75 K 76 L 77 M 78 N

Page 9: 2009/10/271 第十章 : 字元與字串 張智星 jang@cs.nthu.edu.tw jang 清大資工系 多媒體檢索實驗室

2009/10/27 9

ASCII 碼對照表 (3/3)ASCII 碼 鍵盤 ASCII 碼 鍵盤 ASCII 碼 鍵盤 ASCII 碼 鍵盤

79 O 80 P 81 Q 82 R

83 S 84 T 85 U 86 V

87 W 88 X 89 Y 90 Z

91 [ 92 \ 93 ] 94 ^

95 _ 96 ` 97 a 98 b

99 c 100 d 101 e 102 f

103 g 104 h 105 i 106 j

107 k 108 l 109 m 110 n

111 o 112 p 113 q 114 r

115 s 116 t 117 u 118 v

119 w 120 x 121 y 122 z

123 { 124 | 125 } 126 ~

Page 10: 2009/10/271 第十章 : 字元與字串 張智星 jang@cs.nthu.edu.tw jang 清大資工系 多媒體檢索實驗室

2009/10/27 10

字元的儲存 無論是中文或英文,每一個字元都會佔用兩個位元組

( 2 Bytes ),故在上頁中,字串變數 sentence 總共由 16 個字元構成,佔用的記憶體總計為三十二個位元組( 32 bytes )

whos 指令 : 檢視字串變數 sentence 所佔用儲存空間 (whos 變數 )

MATLAB 是以兩個位元組來儲存一個字元,所以也可以支援 Big5 的中文碼,而且 Big5 中文的 ASCII 內碼都會大於數字 128

由於 MATLAB 將字串以其相對應之 ASCII 內碼(即數字形式)儲存成一列向量,故若對此字串直接進行數值運算, MATLAB 會先將此字串轉成數值,再進行一般數值向量的運算

Page 11: 2009/10/271 第十章 : 字元與字串 張智星 jang@cs.nthu.edu.tw jang 清大資工系 多媒體檢索實驗室

2009/10/27 11

字元與字串的基本概念 -eval eval 指令 : 直接“執行”某一特定字串,其效果就如同直接在 MATLAB

指令視窗內輸入此一特定字串 eval 指令特別適用於在 for - loop 內自動產生有規律的變數名稱

範例 10-11: string111.m

Name Size Bytes Class x3 3x3 72 double array x4 4x4 128 double array x5 5x5 200 double array x6 6x6 288 double arrayGrand total is 86 elements using 688 bytes

x3 , x4 , x5 , x6 都是在 for - loop 中產生的變數,分別代表維度為 3×3、4×4、 5×5、 6×6 的魔方陣

clear all % 清除所有變數for i = 3:6

eval(['x', int2str(i) , '= magic(' , int2str(i) , ') ; ']); end whos x*

Page 12: 2009/10/271 第十章 : 字元與字串 張智星 jang@cs.nthu.edu.tw jang 清大資工系 多媒體檢索實驗室

2009/10/27 12

字串的判斷 class 或 ischar 指令 : 判斷某一個變數

是否為字串 範例 10-12: string112.m

字串變數所佔用的空間是同長度雙精準( Double )數值變數的四分之一

chinese = '今日事,今日畢 ';out1 = class(chinese) % out1 的值是 “ char”,代表 chinese 是字串變數x = chinese+1;out2 = ischar(x) % out2 的值是 0 ,代表 x 不是一個字串變數

Page 13: 2009/10/271 第十章 : 字元與字串 張智星 jang@cs.nthu.edu.tw jang 清大資工系 多媒體檢索實驗室

2009/10/27 13

10-2 一個變數來儲存多個字串 第一種方法是使用二維字元陣列( Two Dime

nsional Character Arrays ) 必須先確認每個字串(即每一橫列)的長度一

樣,否則就必須在短字串結尾補上空白字元範例 10-13: string201.m

departments =ee cs econ

departments = ['ee '; 'cs '; 'econ'] % 注意空白字元的使用

Page 14: 2009/10/271 第十章 : 字元與字串 張智星 jang@cs.nthu.edu.tw jang 清大資工系 多媒體檢索實驗室

2009/10/27 14

一個變數來儲存多個字串 用 char 指令儲存多個字串

得到結果和前一個範例依樣 ; 從二維字元陣列抽取出字串時,切記要使用 deblank

指令來移除尾部的空白字元 範例 10-15: string203.m

.

departments = char('ee', 'cs', 'econ') % 注意「 () 」及「 , 」的使用

departments = char('ee', 'cs', 'econ');dept1 = departments(1,:); % (1,:) 代表第一列的元素 dept2 = deblank(dept1); % 使用 deblank 指令來移除尾部的空白字元 len1 = length(dept1) % 顯示變數 dept1 的長度 =4len2 = length(dept2) % 顯示變數 dept2 的長度 =2

Page 15: 2009/10/271 第十章 : 字元與字串 張智星 jang@cs.nthu.edu.tw jang 清大資工系 多媒體檢索實驗室

2009/10/27 15

一個變數來儲存多個字串 當字串的長度差異甚大,那麼使用二維字元陣

列來儲存多個字串,將造成記憶體空間的浪費,怎麼辦 ?

「異質陣列」 : 使用大括號框住多個字串 , 或用 cellstr 指令將字元陣列轉換成異質陣列 (string204.m,string205.m)

若要將包含字串的異質陣列轉換成一般的二維字元陣列,還是可以使用 char 指令

Page 16: 2009/10/271 第十章 : 字元與字串 張智星 jang@cs.nthu.edu.tw jang 清大資工系 多媒體檢索實驗室

2009/10/27 16

10-3 字串的比較、尋找、代換、分解與結合

strcmp 指令 : 用於比較字串內容的異同 範例 10-19: string301.m

不相等回傳 0, 相等回傳 1 DIFFERENT to C

str1 = 'today'; str2 = 'tomorrow'; str3 = 'today'; out1 = strcmp(str1, str2) % 比較兩字串 str1 和 str2 = 0out2 = strcmp(str1, str3) % 比較兩字串 str1 和 str3 = 1

Page 17: 2009/10/271 第十章 : 字元與字串 張智星 jang@cs.nthu.edu.tw jang 清大資工系 多媒體檢索實驗室

2009/10/27 17

字串的比較和尋找 strncmp 指令 : 用於比較字串的前 n 個字元 strcmp 及 strncmp 指令亦可用於字串異質陣列

findstr 指令 : 尋找在某一個長字串中的子字串( Substrings ),並傳回其起始位置

strrep 指令 : 用於字串尋找及代換 , 例如 :newString = strrep(string, pattern, pattern2)

Page 18: 2009/10/271 第十章 : 字元與字串 張智星 jang@cs.nthu.edu.tw jang 清大資工系 多媒體檢索實驗室

2009/10/27 18

字串的分解 strtok 指令 : 根據一給定的分界字元( Delimiting Characters ),將

一字串拆解成數個字串,預設分界字元為空白字元 strvcat 指令 : 將拆解下來的字串內容(即儲存在字串變數 chopped

中) 加到二維字元陣列 parsed 中 範例 10-24: string306.m

parsed =ee cs econstatme

input_string = 'ee cs econ stat me'; remainder = input_string; parsed = ''; % 建立一空字元陣列 while (any(remainder))

[chopped, remainder] = strtok(remainder); parsed = strvcat(parsed, chopped);

end parsed

Page 19: 2009/10/271 第十章 : 字元與字串 張智星 jang@cs.nthu.edu.tw jang 清大資工系 多媒體檢索實驗室

2009/10/27 19

字串的結合 MATLAB 在讀入中文字串時,將每一個中文字的 2-b

yte 分開來讀,造成兩個中文字變成四個字串元素 xlate 指令 : 將中文的 2-byte 「結合」在一起 範例 10-27: string309.m

line2 =我是 Rogerans = 7

fid = fopen('tbig5.txt');line = fgetl(fid); % 讀取一列檔案內容fclose(fid);line2 = xlate(line) % 使用 xlate 將被猜開的中文結合在一起leng = length(line2) % 顯示字串長度

Page 20: 2009/10/271 第十章 : 字元與字串 張智星 jang@cs.nthu.edu.tw jang 清大資工系 多媒體檢索實驗室

2009/10/27 20

10-4 字串、數值與陣列的轉換 int2str 指令 : 將整數型態的資料轉換成

字串資料 例如 :y = int2str(x), x 為整數 , y 為字串

num2str 指令 : 將實數轉為字串 dec2hex 指令 : 將 10 進位數值資料轉換成 16 進位的字串表示法

更多類似指令如 : hex2num, hex2dec, bin2dec….

Page 21: 2009/10/271 第十章 : 字元與字串 張智星 jang@cs.nthu.edu.tw jang 清大資工系 多媒體檢索實驗室

2009/10/27 21

字串陣列的轉換 mat2str 指令可將矩陣轉換為字串,此字串若再經由 eval 指令的使用,可再變回原先的矩陣

範例 10-32: string405.m

B =[1 2 1;3 5 6] ans = 1

A = [1 2 1; 3 5 6 ]; B = mat2str(A) % 將矩陣 A 轉成字串 B A2 = eval(B) % 再將字串 B 轉回矩陣 A2isequal(A, A2) % 測試 A 和 A2 是否相等

Page 22: 2009/10/271 第十章 : 字元與字串 張智星 jang@cs.nthu.edu.tw jang 清大資工系 多媒體檢索實驗室

2009/10/27 22

字串與數值的結合 sprintf 指令 : 結合數值或字串,以產生新字串 (%s-印出字串 ,%g-印出數值 , 可使用 %f 或加上控制印出位數大小的數字 )

範例 10-33: string406.m

newString =「圓周率」是 3.14159

sscanf 可依給定的格式來解析出所要的字串或數值 範例 10-34: string407.m

mat = 2.0000 4.7000 5.2000

str = '圓周率 ';newString = sprintf(' 「 %s 」是 %g', str, pi)

str = '2 4.7 5.2';mat = sscanf(str, '%f')