建立字串(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() 函數。