Chap6字符串eval_第1頁
Chap6字符串eval_第2頁
Chap6字符串eval_第3頁
Chap6字符串eval_第4頁
Chap6字符串eval_第5頁
已閱讀5頁,還剩5頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第6章 文 本 MATLAB真正強有力的地方在于它的數(shù)值處理能力。然而,經(jīng)常希望操作文本,例如把標號和標題放在圖上。在MATLAB里,文本當作特征字符串或簡單地當作字符串。6.1 字符串 在MATLAB中的字符串一般是ASCII值的數(shù)值數(shù)組,它作為字符串表達式進行顯示。例如, t= How about this character string? t =How about this character string? size(t)ans = 1 32 whos Name Size Elements Bytes Density Complex ans 1 by 2 2 16 Full No t

2、 1 by 32 32 256 Full No 一個字符串是由單引號括起來的簡單文本。在字符串里的每個字符是數(shù)組里的一個元素,字符串的存儲要求每個字符8個字節(jié),如同MATLAB的其它變量。因為ASCII字符只要求一個字節(jié),故這種存儲要求是浪費的,7/8所分配的存儲空間無用。然而,對字符串保持同樣的數(shù)據(jù)結構簡化MATLAB的內部數(shù)據(jù)結構。所給出的字符串操作并不是MATLAB的基本特點,但這種表達是方便和可接受的。 為了了解下面字符串的ASCII表達,只需對字符串執(zhí)行一些算術運算。最簡單和計算上最有效的方法是取數(shù)組的絕對值。例如, u=abs(t)u = Columns 1 through 12

3、72 111 119 32 97 98 111 117 116 32 116 104 Columns 13 through 24 105 115 32 99 104 97 114 97 99 116 101 114 Columns 25 through 32 32 115 116 114 105 110 103 63 u=t+0u = Columns 1 through 12 72 111 119 32 97 98 111 117 116 32 116 104 Columns 13 through 24 105 115 32 99 104 97 114 97 99 116 101 114 Co

4、lumns 25 through 32 32 115 116 114 105 110 103 63 在上面后一個例子里,加零到字符串也改變了它的ASCII的表示。函數(shù)setstr提供了逆轉換。 v=setstr(u)v =How about this character string?因為字符串是數(shù)值數(shù)組,它們可以用MATLAB中所有可利用的數(shù)組操作工具進行操作。例如, u=t(16:24)u =character字符串象數(shù)組一樣進行編址。這里元素16到24包含單詞character u=t(24:-1:16)u =retcarahc這是單詞character的反向拼寫。 u=t(16:24)

5、 u =character用轉置算子將單詞character變換成一個列。 v= I cant find the manual! v =I cant find the manual!字符串內的單引號是由兩個連續(xù)的單引號來表示。字符串連接可以直接從數(shù)組連接中得到。 u= If a woodchuck could chuck wood, ; v= how much wood would a woodchuck chuck? ; w=u vw =If a woodchuck could chuck wood, how much wood would a woodchuck chuck? 函數(shù)disp

6、允許不打印它的變量名而顯示一個字符串。例如,disp(u)If a woodchuck could chuck wood,注意u = 語句被去掉了。這對腳本文件內顯示幫助的文本有用。 如同矩陣,字符串可以有多個行,但每行必須有相同數(shù)目的列數(shù)。因此,顯然要用空格以使所有行有相同長度,例如, v= Character strings having more than one row must have the same number of column just like matrices! v =Character strings having more thanone row must hav

7、e the same number of column just like matrices! 考慮下面例子,它把一個字符串轉換成大寫。首先,函數(shù)find用來找出小寫字符的下標值,然后,從小寫元素中只減去小寫與大寫之差,最后,用setstr把求得的數(shù)組轉換成它的字符串表示。 disp(u)If a woodchuck could chuck wood, i=find(u= a & u= a & v ; tape=input(t)Enter number of rolls of tape 5tape = 5 另外,函數(shù)input能輸入一個字符串: x=input( Enter anything

8、, s )Enter anything anything can be enteredx =anything can be entered 這里,在函數(shù)input里的附加參量s告訴MATLAB,作為一個字符串,只要把用戶輸入傳送到輸出變量,就不需要引號。事實上,如果將引號包括進去,它們就變成返回字符串的一部分。6.2 字符串轉換 除了上面討論的,字符串和它的ASCII表示之間轉換外,MATLAB還提供了大量的其它的有用的字符串轉換函數(shù)。它們包括:表6.1字 符 串 轉 換abs字符串到ASCII轉換dec2hex十進制數(shù)到十六進制字符串轉換fprintf把格式化的文本寫到文件中或顯示屏上hex

9、2dec十六進制字符串轉換成十進制數(shù)hex2num十六進制字符串轉換成IEEE浮點數(shù)int2str整數(shù)轉換成字符串lower字符串轉換成小寫num2str數(shù)字轉換成字符串setstrASCII轉換成字符串sprintf用格式控制,數(shù)字轉換成字符串sscanf用格式控制,字符串轉換成數(shù)字str2mat字符串轉換成一個文本矩陣str2num字符串轉換成數(shù)字upper字符串轉換成大寫 在許多情況下,希望把一個數(shù)值嵌入到字符串中。幾個字符串轉換可完成這個任務。 rad=2.5; area=pi*rad2; t= A circle of radius num2str(rad) has an area o

10、f num2str(area) . ; disp(t)A circle of radius 2.5 has an area of 19.63. 這里函數(shù)num2str用來把數(shù)值轉換成字符串,字符串連接用來把所轉換的數(shù)嵌人到一個字符串句子中。按類似方式,int2str把整數(shù)轉換成字符串。無論是num2str還是int2str都調用函數(shù)sprintf,它用類似C語言語法把數(shù)值轉換成字符串。 函數(shù)fprintf經(jīng)常是函數(shù)disp的一個有用替換,由于它提供了對結果更多的控制。當準備把格式化的數(shù)據(jù)寫到一個文件中去時,按缺省它在命令窗口顯示結果。例如, fprintf( See what this doe

11、s )See what this does fprintf( See what this doesn )See what this does 在上面第一個例子里,fprintf顯示字符串,然后立即給出MATLAB提示符。相反,在第二個例子里,n 插入一個新行字符,在MATLAB提示符出現(xiàn)之前創(chuàng)建一個新行。 無論fprintf還是sprintf以同樣方式處理輸入?yún)⒘?,但fprintf把輸出送到顯示屏或文件中,而sprintf把輸出返回到一個字符串中。例如,上面的例子用num2str可重寫為 t=sprintf( A circle of radius %.4g has an area of %.4

12、g. , rad, area); disp(t)A circle of radius 2.5 has an area of 19.63. fprintf( A circle of radius %.4g has an area of %.4g.n , rad, area)A circle of radius 2.5 has an area of 19.63. 這里%.4g是用在函數(shù)num2str中的數(shù)據(jù)格式。%.4g就是用指數(shù)或定點標記,不管哪一種更短些,只顯示至4位數(shù)字。除了g格式,還可用e (指數(shù))和f (定點)轉換。表6.2表明在各種不同轉換下,如何顯示pi結果。表6.2數(shù) 值 格 式

13、轉 換 例 子命令結果fprintf( %.0en ,pi)3e+00fprintf( %.1en ,pi)3.1e+00fprintf( %.3en ,pi)3.142e+00fprintf( %.5en ,pi)3.14159e+00fprintf( %.10en ,pi)3.1415926536e+00fprintf( %.0fn ,pi)3fprintf( %.1fn ,pi)3.1fprintf( %.3fn ,pi)3.142fprintf( %.5fn ,pi)3.14159fprintf( %.10fn ,pi)3.1415926536fprintf( %.0gn ,pi)3f

14、printf( %.1gn ,pi)3fprintf( %.3gn ,pi)3.14fprintf( %.5gn ,pi)3.1416fprintf( %.10gn ,pi)3.141592654fprintf( %.8.0gn ,pi) 3fprintf( %.8.1gn ,pi) 3fprintf( %.8.3gn ,pi) 3.14fprintf( %.8.5gn ,pi) 3.1416fprintf( %.8.10gn ,pi)3.141592654 注意,對e 和f 格式,小數(shù)點右邊的十進制數(shù)就是小數(shù)點右邊要顯示的多少位數(shù)字。相反,在g 的格式里,小數(shù)點右邊的十進制數(shù)指定了顯示數(shù)字的

15、總位數(shù)。另外,注意最后的五行,其結果指定為8個字符長度,且是右對齊。在最后一行,8被忽略,因為指定超過了8位。 概括起來,當需要比缺省函數(shù)disp,num2str和int2str所提供的更多的控制時,fprintf和sprintf是有用的。 函數(shù)str2mat把一列的幾個字符串轉換成一個字符串矩陣。例如, a= one ; b= two ; c= three ; disp(str2mat(a, b, c, four )one two threefour 盡管從上面看不明顯,上面的每行有同樣數(shù)目的元素。較短行用空格補齊,使結果形成一個有效的矩陣 在逆方向轉換中,有時是很方便的。 s= 1 2;

16、pi 4 % a string of a MATLAB matrixs =1 2; pi 4 str2num(s)ans = 1.0000 2.0000 3.1416 4.0000 s= 123e+5 % a string containing a simple numbers =123e+5 str2num(s)ans = 12300000 函數(shù)str2num不能接受用戶定義的變量,也不能執(zhí)行轉換過程的算術運算。更多的信息,請看在線幫助。6.3 字符串函數(shù)MATLAB提供了大量的字符串函數(shù),包括列在表6.3當中的。表6.3字 符 串 函 數(shù)eval(string)作為一個MATLAB命令求字

17、符串的值eval(try,catch)blanks(n)返回一個n個零或空格的字符串deblank去掉字符串中后拖的空格feval求由字符串給定的函數(shù)值findstr從一個字符串內找出字符串isletter字母存在時返回真值isspace空格字符存在時返回真值isstr輸入是一個字符串,返回真值lasterr返回上一個所產(chǎn)生MATLAB錯誤的字符串strcmp字符串相同,返回真值strrep用一個字符串替換另一個字符串strtok在一個字符串里找出第一個標記 列在上面的第一個函數(shù)eval給MATLAB提供宏的能力。其中,該函數(shù)提供了將用戶創(chuàng)建的函數(shù)名傳給其它函數(shù)能力,以便求值。它的應用例子包括

18、: a=eval( sqrt(2) )a = 1.4142 eval( a=sqrt(2) )a = 1.4142 上面的例子演示了函數(shù)eval。顯然,它們不是計算2的平方根的最簡單方法。當被求值的字符串是由子字符串連接而成,或將字符串傳給一個函數(shù)以求值時,eval非常有用。說明這種用途例子本書的以后會提及。 如果字符串傳遞到eval不能被辨認,MATLAB提供下列語法: eval( a=sqrtt(2) , a= )a = 這里第二個參量被執(zhí)行。由于第一個參量有誤,即sqrtt不是一個有效的MATLAB函數(shù)。這種形式經(jīng)常被描述為eval(try,catch)。 函數(shù)feval與eval類似,

19、但在用法上有更多的限制。feval( fun ,x)求由字符串 fun 給定的函數(shù)值,其輸入?yún)⒘渴亲兞縳。即feval( fun ,x)等價于求fun(x)值。例如, a=feval( sqrt ,2)a = 1.4142 函數(shù)eval,feval的基本用途限在用戶創(chuàng)建的函數(shù)內。一般地,feval可求出有大量輸入?yún)⒘康暮瘮?shù)值,例如,feval( fun , x, y, z) 等價于求fun(x, y, z)值。 列在上面表中的許多字符串函數(shù)提供了基本的字符串語法分析能力。例如,findstr返回一個在另一個字符串內字符串的起始下標值。 b= Peter Piper picked a peck

20、of pickled peppers ; findstr(b, ) % find spaceans = 6 12 19 21 26 29 37 findstr(b, p ) % find the letter pans = 9 13 22 30 38 40 41 find(b= = p ) % for single character searches the find command works tooans = 9 13 22 30 38 40 41 findstr(b, cow ) % find the word cowans = findstr(b, pick ) % find the string pickans = 13 30 注意這個函數(shù)對大小寫是敏感的,當不匹配時,返回空矩陣。findstr對字符串矩陣不起作用。 strrep(b, p , P ) % capitalize all p sans =Peter PiPer Picked a Peck of Pickled PePPers strrep(b, Peter , Pamela ) % change Peter to Pamelaans =Pamela Piper picked

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論