建立字串(Creating Strings)
最簡單的字串產生方法上面已經介紹過了,直接用單引號或雙引號包起來就可以了,接下來介紹一些其他的方式。
blanks (n)
blanks(n)
函數會產生由空白字元(ASCII 碼為 32)所構成的字串,參數 n
可以指定字串的長度,例如:
str = blanks(10); whos str
輸出為
Attr Name Size Bytes Class ==== ==== ==== ===== ===== str 1x10 10 char
str
是一個長度為 10 的空白字串。
連接字串(Concatenating Strings)
上面已經示範過如何使用中括弧的方式將字串連接起來,除了這個方式之外,Octave 中也有許多函數可以處理字串接的工作,例如:char()
、strvcat()
、strcat()
與 cstrcat()
函數,除此之外,一般的連接函數也可以用在字串上,例如:cat()
、horzcat()
與 vertcat()
等。
除了 cstrcat()
函數之外,所有的字串連接函數都可以一連串的將數值依照 ASCII 碼轉換為字串,例如:
char([98, 97, 110, 97, 110, 97])
輸出為
ans = banana
char()
與 strvcat()
函數會將多個字串以垂直的方式接起來,而 strcat()
與 cstrcat()
函數則是以水平的方式將字串連接起來,例如:
char("an apple", "two pears")
輸出為
ans = an apple two pears
strcat("oc", "tave", " is", " good", " for you")
輸出為
ans = octave is good for you
char()
函數在遇到空字串(長度為 0 的字串)時,會產生一個空的列(row),而 strvcat()
函數遇到同樣的情況則是會將空字串忽略,例如:
char("orange", "green", "", "red")
輸出為
ans = orange green red
strvcat("orange", "green", "", "red")
輸出為
ans = orange green red
除了 cstrcat()
之外的所有字串連接函數都可以接受巢狀陣列的資料(請參考資料容器),char()
與 strvcat()
函數會將巢狀陣列轉換為字串,而 strcat()
函數則是連接巢狀陣列中 cell 內的字串,例如:
char({"red", "green", "", "blue"})
輸出為
ans = red green blue
strcat({"abc"; "ghi"}, {"def"; "jkl"})
輸出為
ans = { [1,1] = abcdef [2,1] = ghijkl }
strcat()
函數會將字串結尾的空白移除(除了在巢狀陣列之內的),而 cstrcat()
函數則會將結尾的空白保留,這兩個規則在不同的情況下都很有用,例如:
strcat(["dir1";"directory2"], ["/";"/"], ["file1";"file2"])
輸出為
ans = dir1/file1 directory2/file2
cstrcat(["thirteen apples"; "a banana"], [" 5$";" 1$"])
輸出為
ans = thirteen apples 5$ a banana 1$
上面這個 cstrcat()
中,空白字元來自於 Octave 自動補齊的特性,在建立字元陣列時會在較短的字串結尾自動補上的空白,請參考上面的說明。
char (x) char (n, ...) char (s1, s2, ...) char (cell_array)
char()
函數可以從一個或多個數值矩陣、字元矩陣或巢狀陣列建立字元陣列,所有的參數會依照順序垂直的連接起來,並將較短的字串補齊空白後傳回,空字串的參數會被保留。若是輸入的數值,則會將數值依照 ASCII 碼轉為字元,而若是數值超出 ASCII 碼的範圍(0-255),則會產生錯誤。對於巢狀陣列,char()
會將每個元素分開處理,巢狀陣列經由 char()
所轉換的結果,在大部分的情形下可以再經由 cellstr()
函數轉換回原來的巢狀陣列。例如:
char ([97, 98, 99], "", {"98", "99", 100}, "str1", ["ha", "lf"])
strvcat (x) strvcat (n, ...) strvcat (s1, s2, ...) strvcat (cell_array)
strvchar()
函數可以從一個或多個數值矩陣、字元矩陣或巢狀陣列建立字元陣列,所有的參數會依照順序垂直的連接起來,並將較短的字串補齊空白後傳回,空字串的參數會被忽略。若是輸入的數值,則會將數值依照 ASCII 碼轉為字元,而若是數值超出 ASCII 碼的範圍(0-255),則會產生錯誤。對於巢狀陣列,strvchar()
會將每個元素分開處理,巢狀陣列經由 char()
所轉換的結果,在大部分的情形下可以再經由 cellstr()
函數轉換回原來的巢狀陣列。例如:
strvcat ([97, 98, 99], "", {"98", "99", 100}, "str1", ["ha", "lf"])
strcat (s1, s2, ...)
strcat()
函數會將所有的參數以水平的方式連接起來,當輸入的參數為字串的巢狀陣列時,strcat()
會將個別的 cell 分開處理,若是輸入的參數是數值,則會依照 ASCII 碼轉換為字元。字串結尾的空白會被忽略。例如:
s = [ "ab"; "cde" ]; strcat (s, s, s)
輸出為
ans = ababab cdecdecde
s = { "ab"; "cde" }; strcat (s, s, s)
輸出為
ans = { [1,1] = ababab [2,1] = cdecdecde }
strcat("abc ", "ABC")
輸出為
ans = abcABC
cstrcat (s1, s2, ...)
cstrcat()
函數會將所有的參數以水平的方式連接起來,字串結尾的空白會被保留。例如:
cstrcat ("ab ", "cd")
輸出為
ans = ab cd
s = [ "ab"; "cde" ]; cstrcat (s, s, s)
輸出為
ans = ab ab ab cdecdecde
將數值轉為字串(Conversion of Numerical Data to Strings)
要將數值轉換為字串,除了上述依照 ASCII 碼的方法之外,Octave 亦提供了其他的轉換方式與相關函數,例如 mat2str()
與 num2str()
函數可以轉換實數或複數的矩陣;int2str()
函數則可以轉換整數的矩陣,若是複數則會取其實部並轉為最接近的整數。更一般化的轉換可以使用 sprintf()
函數。
mat2str (x, n) mat2str (..., 'class')
mat2str()
可將實數或複數的矩陣轉為字串,其傳回值適用於 eval()
函數。
參數 n
是指定數值的精確度,若 n
指定為一個純量,則實部與虛部都使用同一個精確度,若指定為向量,則 n(1)
代表實部的精確度,而 n(2)
代表虛部的精確度。若是不指定,則 n
預設為 17
。例如:
mat2str ([ -1/3 + i/7; 1/3 - i/7 ], [4 2])
結果為:"[-0.3333+0.14i;0.3333-0.14i]"
。
mat2str ([ -1/3 +i/7; 1/3 -i/7 ], [4 2])
結果為:"[-0.3333+0i,0+0.14i;0.3333+0i,-0-0.14i]"
。
若是加入參數 'class'
,則輸出時會加上 x
的類別,讓 eval()
函數在執行時也會得到相同類別的矩陣,例如:
mat2str (int16([1 -1]), 'class')
結果為:"int16([1,-1])"
。
num2str (x) num2str (x, precision) num2str (x, format)
num2str()
函數可將純量或陣列數值轉換為字串或字元陣列。參數 precision
是指定輸出的有效位數;參數 format
是輸出的格式,此格式與 sprintf()
函數所使用的格式相同。例如:
num2str (123.456)
結果為:"123.46"
。
num2str (123.456, 4)
結果為:"123.5"
。
s = num2str ([1, 1.34; 3, 3.56], "%5.1f")
輸出為
s = 1.0 1.3 3.0 3.6
此 s
是一個字元矩陣:
whos s
輸出為
Attr Name Size Bytes Class ==== ==== ==== ===== ===== s 2x8 16 char
num2str()
函數亦可處理複數的轉換:
num2str (1.234 + 27.3i)
結果為:"1.234+27.3i"
。
num2str()
函數並不是非常的有彈性,若需要更有彈性的輸出可以使用 sprintf()
函數。
num2str()
函數在處理複數時,所指定的 format
只能包含單一個數值的格式,若是加入其他任何多餘的字元,將會導致不可預期的結果。int2str (n)
num2str()
函數可將純量或陣列整數轉換為字串或字元陣列。例如:
int2str(123)
輸出為
ans = 123
s = int2str ([1, 2, 3; 4, 5, 6])
輸出為
s = 1 2 3 4 5 6
得到的 s
是一個字元矩陣:
whos s
輸出為
Attr Name Size Bytes Class ==== ==== ==== ===== ===== s 2x7 14 char
若需要更有彈性的輸出,可以使用 sprintf()
函數。