使用變數(Using Variables)

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

  • x
  • x15
  • __foo_bar_baz__
  • fucnrdthsucngtagdjb
在 Octave 中以雙下底線開頭的變數名稱是專門用於 Octave 內部的變數,例如 __foo_bar_baz__,一般使用者在自行撰寫程式時,除非是要更改 Octave 內部的變數設定,否則應該要避免使用這樣的變數名稱,以免影響 Octave 內部的變數。

Octave 會將大寫與小寫的字母視為不同的變數名稱,例如 varVar 是兩個不同的變數。

單一個變數名稱就是一個算式,這樣會輸出此變數的值,變數的值可以透過指定運算子(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 的關鍵字,例如 forif 等,但不會自動避開函數名稱,例如 sin,因此要避免產生與函數名稱相同的變數名稱,可以使用 exclusions 參數加以指定。

namelengthmax ()

namelengthmax() 函數會傳回與 Matlab 相容的最長變數名稱長度,在 Octave 中最長的變數名稱長度是 2^31-1,而在 Matlab 中若是變數名稱長度沒有那麼長,其最大長度可由此函數獲得,若要與 Matlab 相容,則所有的變數名稱長度都要小於這個值,若變數名稱長度超過這個值,在 Matlab 中會將變數名稱超過的部分自動刪除。