分類: Octave

Octave 數值資料(Numeric Data Types)

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 亦可以用 jIJ 來替代,這四個字母的功能相同。

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]

這樣會產生一個 22 的矩陣 a

在指定矩陣可以使用各種的表示方式,只要其組合起來的維度是正確的都可以被 Octave 接受,例如:

b = [a, a]

這會將兩個 a 合併起來變成一個 24 的矩陣。而若是組合起來的維度不正確,就會出現錯誤:

[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]

會被視為 11,所以會得到 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)

空矩陣也可以用來刪除矩陣的行或列,請參考運算。

Page: 1 2 3 4 5

G. T. Wang

個人使用 Linux 經驗長達十餘年,樂於分享各種自由軟體技術與實作文章。

Share
Published by
G. T. Wang
標籤: 數學

Recent Posts

光陽 KYMCO GP 125 機車接電發動、更換電瓶記錄

本篇記錄我的光陽 KYMCO ...

2 年 ago

[開箱] YubiKey 5C NFC 實體金鑰

本篇是 YubiKey 5C ...

3 年 ago

[DIY] 自製竹火把

本篇記錄我拿竹子加上過期的苦茶...

3 年 ago