在 Octave 中有許多種類型(type)的變數,例如實數(real)或複數(complex)的純量(scalars)或矩陣(matrices)、字串(character strings)、資料結構(data structure)以及可以包含各種類型的巢狀陣列(cell arrays)。
Octave 亦允許使用者透過 C++ 程式語言自行撰寫程式碼定義新的變數類型,新增變數類型並不需要將所有的 Octave 程式碼重新編譯,在某些系統中新的變數類型可以在 Octave 執行時動態載入(可參考動態載入函數、自訂變數類型)。
typeinfo (expr)
typeifno(expr) 函數會傳回 expr 的變數類型(type),若是沒有指定 expr 參數,則回傳目前所有的支援的變數類型。
內建的資料類型(Built-in Data Types)
Octave 內建的資料類型包含實數(real)與複數(complex)的純量(scalars)與矩陣(matrices)、ranges、字串(character strings)、資料結構(data structure)與巢狀陣列(cell array),在未來 Octave 亦有可能再新增加其他的資料類型。
變數的資料類型可以透過以下的函數查詢與轉換:
class (expr)
class (s, id)
class (s, id, p, ...)
class(expr) 可以查詢 expr 的類別(class),class(s, id) 則是產生新的類別,參數 s 是指定新類別的資料結構(structure),id 是新類別的名稱。其餘的參數是用來指定此類別的父類別。
isa (x, class)
isa(x, class) 函數可以用來測試 x 的類別是否為 class。
cast (val, type)
cast(val, type) 函數可將 val 轉換為 type 類型。
typecast (x, type)
typecast(x, type) 將 x 轉換為 type 類型,但不變更 x 所儲存的資料。type 參數可以是下列其中之一: "uint8"、 "uint16"、 "uint32"、 "uint64"、 "int8"、 "int16"、 "int32"、 "int64"、 "single" 或 "double"。例如:
x = uint16 ([1, 65535]);
typecast (x, "uint8")
swapbytes (x)
swapbytes(x) 函數可將 x 的值在 little endian 與 big endian 之間轉換。例如:
swapbytes (uint16 (1:4))
以下介紹 Octave 中內建的資料類型:
數值(Numeric Objects)
Octave 中的數值變數包含實數、複數與整數的純量與矩陣,所有 Octave 內建的浮點數資料都是以雙精度浮點數(double precision numbers)的方式儲存,在使用 IEEE 浮點格式的系統中,可儲存的浮點數範圍大約在 2.2251e-308 到 1.7977e+308 之間,relative precision 大約為 2.2204e-16,精確的數值儲存在 realmin、 realmax 與 eps 變數中。
在 Octave 中的矩陣可以指定為任何的大小,甚至可以動態改變。Octave 中提供一系列的矩陣操作功能,進一步的說明請參考數值資料。
缺失資料(Missing Data)
缺失資料在 Octave 可以使用 NA(Not Available)來表示:
NA
NA (n)
NA (n, m)
NA (n, m, k, ...)
NA (..., class)
NA 函數可以產生 NA 的純量,NA(n) 是 n 乘 n 的 NA 方陣,NA(n, m) 是 n 乘 m 的 NA 矩陣,NA(n, m, k, ...) 是高維度的 NA 陣列,class 參數是指定傳回值的類型,可指定 "double" 或 "single",例如指定一個 NA 值:
na_val = NA
3 乘 3 的 NA 矩陣:
na_mat = NA(3)
isna (x)
isna() 函數可以檢查一個值是否為 NA,例如:
isna ([13, Inf, NA, NaN])
一個
NA值不會等於另一個NA值(NA != NA),若要檢查一個值是不是NA必須使用isna()函數。
字串(String Objects)
Octave 的字串是以單引號或雙引號包起來的一串字元,目前來說 Octave 是將字串儲存乘矩陣的形式,因此在矩陣上可以用的索引運算亦可用於字串上,關於字串的說明請參考字串資料。
資料結構(Data Structure Objects)
Octave 的資料結構可以讓使用者將相關但不同類型的資料結合在一起,目前 Octave 是以關聯性陣列的方式實做,而其語法類似於 C 語言的 structures,關於資料結構請參考資料容器。
巢狀陣列(Cell Array Objects)
Octave 的巢狀陣列是一個一般性的陣列,可以存放各種不同的類型的資料,請參考資料容器。
物件尺寸(Object Sizes)
以下的函數可以用來查詢或設定變數的尺寸,這些函數可以用於任何類型的變數,在無法判別時會傳回 -1,例如資料結構並沒有行數與列數,因此若將資料結構傳入 rows() 或 columns() 會傳回 -1。
ndims (x)
ndims() 函數會傳回陣列(array)的維度。trailing singleton dimensions 會被忽略。
在 Octave 中任何陣列的維度都大於或等於 2(與 Matlab 相同)。
columns (x)
columns(x) 函數會傳回 x 的行(column)數。
rows (x)
rows(x) 函數會傳回 x 的列(row)數。
numel (x)
numel(x) 函數會傳回在 x 中元素(element)的數量。
length (x)
length(x) 會傳回 x 的長度,一個矩陣的長度定義為行數與列數中較大的那個值(這個奇怪的定義是為了要與 Matlab 相容)。
size (x)
size (x, n)
size(x) 會傳回 x 的列(row)數與行(column)數,當只由一個輸出參數時,會輸出一個列向量,例如:
a = [1, 2; 3, 4; 5, 6]
a_size = size(a)
當有多個輸出參數時,第一個是列數,第二個是行數,例如:
[nr, nc] = size(a)
size(x, n) 函數加入第二個參數 n 可以指定要輸出的維度,例如:
size(a, 2)
這樣會傳回矩陣 A 的行數。
isempty (x)
isempty(x) 函數用來判斷 x 是否為空矩陣(empty matrix,即行數或列數等於0 的矩陣),若為空矩陣則傳回 1,否則傳回0。
isnull (x)
isnull(x) 函數用來判斷 x 是否為 null 的矩陣、字串、單引號之字串。例如:
isnull([])
將陣列的某個元素指定為 null 會將此元素從陣列中移除,例如:
a = [1, 3, 5, 7, 9]
a(2) = []
isnull()函數主要用於自行定義的類別將索引指定(indexed assignment)運算子多載化(overloading)的時候。
sizeof (x)
sizeof(x) 傳回 x 所佔的記憶體大小,單位為 byte。
size_equal (a, b, ...)
size_equal(x) 函數判斷所有傳入變數的維度是否都相同,若相同則傳回 1,否則傳回0。若只有傳入一個變數,則傳回 1。例如:
a = [1, 2]
b = [3, 4]
c = 5
size_equal(a, b)
size_equal(a, b, c)
squeeze (x)
squeeze(x) 函數會將 x 的資料保留但去除 singleton dimensions 並傳回結果。例如:
x = rand(2, 1, 3)
squeeze(x)