Octave 中的數值資料包含純量(scalar)、向量(vector)與矩陣(matrix),其中的值可為實數或複數。
純量(Scalars)
最簡單的數值資料就是常數純量,其表示方法可以是整數、浮點數、分數或是科學記號, 例如:
105 1.05e+2 1050e-1
以上三個數值是一樣的。若要表示複數:
3 + 4i 3.0 + 4.0i 0.3e1 + 40e-1i
這三個複數也都表示同樣的數值,其中 i
代表複數的虛部,也就是 -1
的平方根。在 Octave 中要使用 i
來表示複數的虛部時,數字與 i
之間不能有空白,例如:
3 + 4 i
數字與 i
之間若有空白 Octave 就會產生錯誤。
i
亦可以用 j
、I
或 J
來替代,這四個字母的功能相同。Octave 在儲存常數純量時預設是使用雙精度浮點數(double precision)來儲存,若是複數則使用兩個雙精度浮點數儲存。
double (x)
double(x)
會將 x
轉換為雙精度浮點數後傳回,可用於純量或是矩陣。
complex (x) complex (re, im)
complex(x)
會傳回實部為 x
虛部為 0
的複數。complex(re, im)
會傳回實部為 re
虛部為 im
的複數。使用 complex()
函數通常會比直接寫 a + bi
的形式方便,例如:
complex ([1, 2], [3, 4])
矩陣(Matrices)
定義矩陣
在 Octave 要定義一個矩陣很簡單,矩陣的大小 Octave 會自動依照使用者所輸入的資料來決定,每個列以分號(;
)分隔,而一個列中的每個元素則是以逗號(,
)分隔,例如:
a = [1, 2; 3, 4]
這樣會產生一個 2
乘 2
的矩陣 a
。
在指定矩陣可以使用各種的表示方式,只要其組合起來的維度是正確的都可以被 Octave 接受,例如:
b = [a, a]
這會將兩個 a
合併起來變成一個 2
乘 4
的矩陣。而若是組合起來的維度不正確,就會出現錯誤:
[a, 1]
Octave 會顯示其維度不符合:
error: number of rows must match (1 != 2) near line 5, column 5
所有在中括弧中的資料 Octave 都會視為矩陣,Octave 會自動判斷是否要將空白與換行轉換為元素與列的分隔符號,所以上面的矩陣 a 也可以寫成這樣:
a = [1 2 3 4]
但有時候這種寫法會產生混淆,例如:
[1 - 1]
會被視為 1
減 1
,所以會得到 0
,而
[1 -1]
則會被視為 [1, -1]
。
在中括弧中呼叫函數時,也會發生類似的問題:
[sin (pi)]
會被視為 [sin, (pi)]
而產生錯誤,因為 sin()
函數必須要有一個傳入的參數,要避免產生錯誤必須把中間多餘的空白去除或是再加入一個小括弧:
[(sin (pi))]
用於矩陣轉置的單引號('
)周圍的空白也要注意,例如:
a = [1, 2; 3, 4] [a a']
若是單引號前多一個空白:
[a a ']
就會造成錯誤:
error: unterminated string constant parse error: syntax error >>> [a a '] ^
為了避免上述的問題,在表示矩陣時最好不要省略分號與逗號。
矩陣輸出格式
當使用者輸入的變數是矩陣時,Octave 會將矩陣的內容排版後輸出在螢幕上,以下的函數可以控制矩陣的輸出格式:
val = output_max_field_width () old_val = output_max_field_width (new_val)
查詢或設定數值在輸出時的最大字元寬度。
val = output_precision () old_val = output_precision (new_val)
查詢或設定數值在輸出時的最小有效位數。
output_max_field_width()
與 output_precision()
函數配合可以設定各種輸出格式,使用者可以使用 format()
函數設定其組合,請參考輸入與輸出。
val = split_long_rows () old_val = split_long_rows (new_val)
若是矩陣太大無法一次顯示在螢幕上,Octave 預設會將矩陣的列(row)切開,每次顯示矩陣中一部分的列,split_long_rows()
函數可以查詢或設定矩陣在輸出時是否要將列(row)切開輸出,例如:
rand(2, 10)
輸出為
ans = Columns 1 through 7: 0.085634 0.136640 0.455903 0.681633 0.687501 0.533536 0.461752 0.708830 0.679109 0.119020 0.975902 0.110367 0.488791 0.518949 Columns 8 through 10: 0.196560 0.808889 0.576050 0.670522 0.913750 0.866018
Octave 在輸出矩陣中非常大或非常小的數值時,會自動切換成科學記號來表示,這樣可以確保矩陣中每個元素都可以顯示較多的有效數字,若是想以固定的位數來表示矩陣中的數值,可以透過下面的函數更改設定,但更改此設定有可造成輸出的數值被誤判,因此不建議更改。
val = fixed_point_format () old_val = fixed_point_format (new_val)
查詢或設定是否將矩陣數值以固定位數輸出,若是設定以固定位數輸出,Octave 會以 scaled format 輸出矩陣:
fixed_point_format(1) x=[100, 0.2; 0.3, 0.9]
輸出為
x = 1.0e+02 * 1.00000 0.00200 0.00300 0.00900
輸出的第一個數值 1.0e+02
是一個係數,下方矩陣中每個數值乘上這係數就會得到原來的值,有時候這樣的輸出會產生過大的誤差:
fixed_point_format(0) logspace(1, 7, 5)' fixed_point_format(1) logspace(1, 7, 5)'
因此在 fixed_point_format()
不是設定為 0
時,要注意輸出是否會產生錯誤。
空矩陣
在數學上矩陣的兩個維度有可能其中一個是 0
或是兩個都是 0
,Octave 亦允許使用者使用一個維度或兩個維度都是 0
的矩陣,而空矩陣在輸出時預設會使用 []
符號表示,這個可以使用下列函數設定:
val = print_empty_dimensions () old_val = print_empty_dimensions (new_val)
查詢或設定是否要將空矩陣的維度與 []
符號一起輸出,例如:
zeros(3, 0)
會輸出
ans = [](3x0)
空矩陣也可以用來刪除矩陣的行或列,請參考運算。