所謂的變數(variables)就是資料命名以便隨後可以存取,在前面的教學中已經看過很多使用變數的範例了。Octave 中的變數名稱可以使用英文字母、數字或下底線組成,而開頭的第一個字元不能是數字,變數名稱的長度並沒有限制,以下這些都是正確的變數名稱:
xx15__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 中會將變數名稱超過的部分自動刪除。