使用變數(Using Variables)
所謂的變數(variables)就是資料命名以便隨後可以存取,在前面的教學中已經看過很多使用變數的範例了。Octave 中的變數名稱可以使用英文字母、數字或下底線組成,而開頭的第一個字元不能是數字,變數名稱的長度並沒有限制,以下這些都是正確的變數名稱:
x
x15
__foo_bar_baz__
fucnrdthsucngtagdjb
__foo_bar_baz__
,一般使用者在自行撰寫程式時,除非是要更改 Octave 內部的變數設定,否則應該要避免使用這樣的變數名稱,以免影響 Octave 內部的變數。Octave 會將大寫與小寫的字母視為不同的變數名稱,例如 var
與 Var
是兩個不同的變數。
單一個變數名稱就是一個算式,這樣會輸出此變數的值,變數的值可以透過指定運算子(assignment operators)或遞增運算子(increment operators)更改,請參考指定算式。
Octave 內建的變數 ans
是一個特別的變數,當算式的運算結果沒有被指定到一個變數中儲存時,Octave 就會自動將運算結果儲存至 ans
中,例如:
cos(pi)
這個算式的運算結果沒有被指定要儲存在哪一個變數,所以 Octave 會儲存在 ans
中,輸出為
ans = -1
若是有明確指定要儲存的變數名稱:
a = cos(pi)
輸出為
a = -1
這樣 Octave 會將運算結果儲存至變數 a
,而 ans
的值不會受影響。
Octave 中的變數沒有限制必須保持一定的類型,也就是說一個變數可以一開始儲存一個數值,隨後將此變數指定為一個字串。變數在使用前一定要先指定變數的值,使用未經指定的變數名稱會造成錯誤。
ans
ans
變數會儲存最近一次未指定的儲存變數的運算結果,例如:
3^2 + 4^2
輸出為
ans = 25
isvarname (name)
isvarname(name)
函數會判斷 name
是否為正確的變數名稱,若正確則傳回 true
,否則傳回 false
。例如:
isvarname("test_var")
輸出為
ans = 1
varname = genvarname (str) varname = genvarname (str, exclusions)
genvarname(str)
函數會根據字串 str
產生一個獨特的變數名稱,參數 exclusions
是指定排除的名稱。例如:
x = 3.141; genvarname ("x", who ())
輸出為
ans = x1
若 str
指定為巢狀陣列,則會輸出一個包含獨特變數名稱的巢狀陣列,例如
genvarname ({"foo", "foo"})
輸出為
ans = { [1,1] = foo [1,2] = foo1 }
genvarname()
函數所輸出的結果是字串或字串巢狀陣列,若是需要定義一個變數,可以使用 eval()
函數,例如:
name = genvarname ("x"); eval([name " = 42"]);
這會將產生的變數指定為 42
,輸出為
x = 42
另外,genvarname()
也可以用在產生資料結構的欄位名稱,例如:
x = struct (); for i = 1:3 x.(genvarname ("a", fieldnames (x))) = i; endfor x
輸出為
x = { a = 1 a1 = 2 a2 = 3 }
由於變數名稱只能包含英文字母、數字或下底線,genvarname()
函數會將不符合的字元以下底線代替,變數開頭若為數字,則會在開頭自動加入一個下底線,例如:
genvarname("123abc")
輸出為
ans = _123abc
雙下底線開頭的變數雖然是正確的變數名稱,但這樣的變數名稱是專門留給 Octave 內部的變數使用的,因此在一般的情況應該避免使用這類的名稱,genvarname()
函數也不會產生這樣的變數名稱。
genvarname()
函數所產生的變數名稱會自動避開 Octave 的關鍵字,例如 for
與 if
等,但不會自動避開函數名稱,例如 sin
,因此要避免產生與函數名稱相同的變數名稱,可以使用 exclusions
參數加以指定。
namelengthmax ()
namelengthmax()
函數會傳回與 Matlab 相容的最長變數名稱長度,在 Octave 中最長的變數名稱長度是 2^31-1
,而在 Matlab 中若是變數名稱長度沒有那麼長,其最大長度可由此函數獲得,若要與 Matlab 相容,則所有的變數名稱長度都要小於這個值,若變數名稱長度超過這個值,在 Matlab 中會將變數名稱超過的部分自動刪除。