變數的狀態(Status of Variables)

在使用 Octave 時常常會需要查看目前存在的變數有哪些,這時候可以使用 who 等相關的指令,這些指令可以顯示目前在記憶體中儲存的變數,例如:

str = "A random string";
who

輸出為

Variables in the current scope:

ans  str
who
who pattern ...
who option pattern ...
C = who("pattern", ...)

who 指令可以列出目前有定義的變數,參數 pattern 可以指定所要顯示變數,指定方式與 clear 函數所使用的指定方式相同,若不指定則預設會顯示所有的區域變數。參數 option 可以指定為下列選項:

  • global:顯示全域變數。
  • -regexp:在 pattern 中使用常規表示法。
  • -file:將下一個參數視為檔案,顯示此檔案中所列的變數,以檔案指定變數時,必須指定變數的完整名稱,無法使用 pattern 的方式比對。

若以函數的方式呼叫,則會傳回包含變數名稱的巢狀陣列,例如:

c = who()

輸出為

c =

{
  [1,1] = ans
  [2,1] = c
  [3,1] = str
}
whos
whos pattern ...
whos option pattern ...
S = whos("pattern", ...)

whos 指令會輸出目前有定義的變數與其細部資訊。其參數的使用方式與 who 指令相同。whos 指令會顯示變數的下列資訊:

  • Attr:變數的屬性(attributes),可能的值有:
    • 空白:一般區域變數。
    • g:全域變數(global variable)。
    • p:永久變數(persistent variable)。
  • Name:變數名稱。
  • Size:變數的尺寸,例如純量是 1×1,向量是 Nx1 或 1xN,二維的矩陣是 MxN。
  • Bytes:變數所占的記憶體大小。
  • Class:變數的類別,例如:雙精度浮點數(double)、單精度浮點數(single)、字元(char)、十六位元無號整數(uint16)、巢狀陣列(cell)與資料結構(struct)等。

以上這些資訊可以使用 whos_line_format() 函數自行設定所要輸出的欄位。

若以函數的方式呼叫,則會傳回包含上述資訊的資料結構,例如:

s = whos()

輸出為

s =
{
  4x1 struct array containing the fields:

    name
    size
    bytes
    class
    global
    sparse
    complex
    nesting
    persistent
}
val = whos_line_format ()
old_val = whos_line_format (new_val)

whos_line_format() 函數可用來設定 whos 指令的輸出格式,完整的欄位格式為:

%[modifier]<command>[:width[:left-min[:balance]]];

command 的部分有下列選項可以使用:

  • a:變數的屬性(attributes)。
  • b:變數所占的記憶體大小(bytes)。
  • c:變數的類別(class)。
  • e:變數所儲存的元素(elements)。
  • n:變數的名稱(name)。
  • s:變數的維度(size)。
  • t:變數的類型(type)。

modifier 的部分可使用的選項有:

  • l:靠左對齊。
  • r:靠右對齊。
  • c:置中對齊。

width 是一個正整數,指定輸出欄位時使用的最小寬度。當欄位的內容較長時,欄位的寬度會依照需要自動增加。

left-minbalance 只有在配合 modifier 輸出變數的維度時才會用到。

預設的格式是 " %a:4; %ln:6; %cs:16:6:1; %rb:12; %lc:-1;\n"

要檢查一個變數是否存在,除了上述的 who 指令外,也可以使用 exist() 函數。

exist (name, type)

exist(name) 函數會檢查 name 是否存在,若 name 是一個變數,則傳回 1;若為包含絕對路徑的檔案名稱、Octave 路徑中的檔案或函數(副檔名為 .m),則傳回 2;若為 Octave 路徑中的 .oct.mex 檔,則傳回 3;若為內建函數,則傳回 5;若為目錄,則傳回 7;若為使用者輸入的函數,則傳回 103;除此之外則傳回 0

exist(name) 函數在 name 為一般檔案時會傳回 2,若是需要獲取更多關於檔案的資訊,可以使用 file_in_path()stat() 函數。

參數 type 可以指定要檢查的類型,若有指定 type 參數,則在檢查時使會針對指定的類型做檢查,可用的選項有:

  • "var":只檢查變數。
  • "builtin":只檢查內建函數。
  • "file":只檢查檔案。
  • "dir":只檢查目錄。

一般來說 Octave 會自己管理記憶體的配置,但有些時候使用者會需要自行將某些變數從記憶體中刪除,例如在處理大量的資料時,會需要將沒有用到的變數刪除,釋放記憶體給其他變數使用。在 Octave 中要刪除變數可以使用 clear() 函數。

clear [options] pattern ...

clear 指令可以刪除由參數 pattern 所指定的變數,pattern 可以包含下列特殊字元:

  • ?:比對任意一個字元。
  • *:比對零個以上的任意字元。
  • [list]:比對中括號中所列出的字元,若括號中的第一個字元是 !^,則會比對這些字元以外的任意字元,例如 [a-zA-Z] 會比對所有大寫與小寫的英文字母。

例如:

clear foo b*r

將會把 foo 與所有 b 開頭 r 結尾的變數刪除。

若呼叫 clear 而不加任何參數,則會刪除所有使用者定義的變數(包含全域變數與區域變數);若加入至少一個參數,則只會刪除比對成功的可見變數,例如我們定義一個函數 foo(),然後再定義一個名稱為 foo 的變數,此時 foo() 函數會被隱藏,這個時候若是執行一次 clear foo,會將變數 foo 刪除,而 foo() 函數變成可見,若再執行一次 clear -f foo 則會將 foo() 函數刪除。

clear 可用的選項有:

  • -all-a:刪除所有使用者定義的區域變數、全域變數與函數。
  • -exclusive-x:刪除所有不符合 pattern 的變數。
  • -functions-f:刪除函數。
  • -global-g:刪除全域變數。
  • -variables-v:刪除區域變數。
  • -classes-c:刪除類別資料結構表與所有變數。
  • -regexp-r:將 pattern 是為常規表示法來比對。

除了 exclusive 之外,其餘的長選項都可以將開頭的連字號 - 省略。

關於函數與變數的細部資訊,例如函數所在的檔案位置等,可以經由下面的指令獲得,但這些資訊通常只有在開發程式時才會用到。

type options funcname ...

type 指令會顯示函數 funcname 的定義,另外也會顯示此函數是使用者定義的(user-definded )還是內建的(built-in ),若不要顯示可加入參數 -q

若有指定輸出參數,則會傳回一個包含函數定義的字串巢狀陣列,例如:

plotdef = type("dec2bin")
which name ...

which 指令可以尋找 name 所在的位置,例如:

which dec2bin

輸出為

`dec2bin' is a function from the file C:\Octave\3.2.4_gcc-4.4.0\share\octave\3.2.4\m\strings\dec2bin.m
what
what dir
w = what (dir)

what 指令會列出目錄中所有的 Octave 檔案,例如:

what 'C:\Octave\3.2.4_gcc-4.4.0\share\octave\3.2.4\m\strings'

輸出為

   base2dec.m          isletter.m          strjust.m
   bin2dec.m           isstrprop.m         strmatch.m
   blanks.m            mat2str.m           strncmpi.m
   cstrcat.m           regexptranslate.m   strrep.m
   deblank.m           rindex.m            strsplit.m
   dec2base.m          str2double.m        strtok.m
   dec2bin.m           str2num.m           strtrim.m
   dec2hex.m           strcat.m            strtrunc.m
   findstr.m           strchr.m            substr.m
   hex2dec.m           strcmpi.m           validatestring.m
   index.m

若有指定輸出參數,則會傳回一個資料結構。