範圍(Ranges)

範圍(Ranges)的表示法可以很方便的表示一個元素間距離相等的列向量(row vector),其表示方法是以冒號(:)分隔開始值、間距與結束值,例如要產生 13 的列向量,元素間的間距為 0.5,則:

1 : 0.5 : 3

產生的列向量等同於 [1, 1.5, 2, 2.5, 3]。間距亦可以是負的,這像會產生遞減的列向量:

3 : -0.5 : 1

若是將間距省略,則 Octave 會使用預設的間距 1 來產生列向量:

1 : 3

產生的列向量等同於 [1, 2, 3]

使用範圍表示法所得到的列向量有可能不包含範圍的結束值,例如:

1.2 : 0.3 : 2.6

若是要確保端點的值可以被納入,請使用 linspace() 函數。

除了在必要的情況,Octave 不會自動將範圍轉換成列向量,而會以範圍的形式儲存,因為列向量通常需要較多的記憶體來儲存,例如 1:10000 在 32 位元的系統就需要佔用 80,000 個位元組。當 Octave 中含有一些運算時,Octave 也會避免將範圍表示法轉換為列向量,例如:

a = 2*(1:1e7) - 1;
b = 1:2:2e7-1;

ab 所產生的列向量是一樣的,但 b 不需要建立一個長度是 10,000,000 的列向量。

範圍表示法無法接受間距為 0 的情況(也就是所有列向量的元素都相同),要產生這樣的列向量可以使用 ones() 函數,例如:

ones(1, 10)
若範圍表示法中包含運算式,Octave 在接受範圍表示法時會自動判斷此運算式是否為常數,若計算結果是常數,則會以此常數替代運算式。

單精度浮點數(Single Precision)

Octave 支援單精度浮點數運算,大部份的函數也都可以使用單精度浮點數的參數,並且以單精度浮點數傳回結果,單精度浮點數的建立可使用 single() 函數。

single (x)

single(x) 會將 x 轉換為單精度浮點數後傳回,可用於純量或是矩陣。例如:

sngl = single(rand(2, 2))
class(sngl)

有許多函數可以直接設定傳回值為單精度浮點數,例如:

ones (2, 2, "single")
zeros (2, 2, "single")
eye (2, 2,  "single")
NaN (2, 2, "single")
NA (2, 2, "single")
Inf (2, 2, "single")

整數(Integer)

Octave 支援整數的純量或矩陣,包含 8、16、32 與 64 位元的有號(signed)與無號(unsigned)整數,由於許多的運算需要使用浮點數,整數在遇到浮點運算時會自動轉換成浮點數,因此整數通常只用於儲存數值而不用來計算。

最常見的整數矩陣是將一般的浮點數矩陣轉換為整數矩陣,例如:

fmat = rand (2, 2)

輸出為

fmat =

   0.70290   0.92763
   0.80579   0.31735

int32() 函數將 fmat 轉換為 32 位元的整數矩陣:

int32(fmat)

輸出為

ans =

  1  1
  1  0

由結果看出浮點數會被轉換為最接近的整數。

isinteger (x)

isinteger(x) 可判斷 x 是否為整數。

isinteger(8) 會傳回 false,因為 Octave 所有的常數預設都是使用雙精度浮點數儲存。
int8 (x)

int8(x) 會將 x 轉換為 8 位元的有號整數後傳回。

uint8 (x)

uint8(x) 會將 x 轉換為 8 位元的無號整數後傳回。

int16 (x)

int16(x) 會將 x 轉換為 16 位元的有號整數後傳回。

uint16 (x)

uint16(x) 會將 x 轉換為 16 位元的無號整數後傳回。

int32 (x)

int32(x) 會將 x 轉換為 32 位元的有號整數後傳回。

uint32 (x)

uint32(x) 會將 x 轉換為 32 位元的無號整數後傳回。

int64 (x)

int64(x) 會將 x 轉換為 64 位元的有號整數後傳回。

uint64 (x)

uint64(x) 會將 x 轉換為 64 位元的無號整數後傳回。

intmax (type)

intmax(type) 會傳回 type 類型整數能夠儲存的最大數值,type 可以指定的類型有:"int8""uint8""int16""uint16""int32""uint32""int64""uint64"

intmin (type)

intmin(type) 會傳回 type 類型整數能夠儲存的最小數值,type 可以指定的類型有:"int8""uint8""int16""uint16""int32""uint32""int64""uint64"

intwarning (action)
intwarning (s)
s = intwarning (...)

控制整數在轉換與運算時的警告訊息設定,可用的參數有:

  • "query":查詢目前的警告訊息的設定,若沒有指定輸出參數,則會直接將輸出顯示在螢幕上,若是有指定輸出參數則會傳回 "identifier""state" 的資料結構。
  • "on":將警告訊息開啟,若是沒有指定輸出參數,則不會有傳回值,若有指定輸出參數則會傳回原本的設定。
  • "off":將警告訊息關閉,若是沒有指定輸出參數,則不會有傳回值,若有指定輸出參數則會傳回原本的設定。

例如查詢目前的設定:

intwarning("query")

關閉警告訊息,並將目前的設定儲存為 old_s

old_s = intwarning("off")

將設定還原:

intwarning(old_s)

整數運算(Integer Arithmetic)

Octave 支援一些基本的整數運算,例如:加(+)、減(-)、乘(.*)、除(./),這些運算可以用於相同類型的整數,也就是說兩個 32 位元的整數可以直接相加,但一個 16 位元與一個 32 位元的整數就無法直接相加。例如:

a = int16(10)
b = int32(10)
a + b

a 是一個 16 位元的整數而 b 是一個 32 位元的整數,若是直接相加就會出現錯誤:

error: binary operator `+' not implemented for `int16 scalar' by `int32 scalar' operations

在 Octave 中對於整數的算術運算會先將整數轉換為雙精度浮點數,經過運算之後在轉換回原來的整數類型,而雙精度浮點數只有 53 個位元可以用來表示整數,所以在 Octave 中無法進行 64 位元的整數運算。

在使用整數運算時,必須注意 underflow 與 overflow 的問題,這個問題會發生在使用的整數類型無法表示計算的結果,例如無號整數無法表示 10 - 20,而 Octave 會確保整數運算的結果是最接近真實值的整數,因此無號整數運算 10 - 20 的結果是 0

Octave 在進行整數除法的運算時,會將結果轉為最接近實際值的整數(使用 round),這與一般的程式語言不同(使用 floor),例如:

int32(5) ./ int32(8)

結果是 1

idivide (x, y, op)

使用不同的規則進行整數除法運算,Octave 預設的整數除法運算 a ./ b 會將結果轉為最接近實際值的整數(使用 round),而 idivide() 函數可以使用其他的規則來進行個別元素的整數除法運算,其中 op 參數可以指定要使用的整數除法規則:

  • "fix":將結果朝向 0 的方向轉為最接近的整數。
  • "round":將結果轉為最接近實際值的整數。
  • "floor":將結果朝向負無限大的方向轉為最接近的整數。
  • "ceil":將結果朝向正無限大的方向轉為最接近的整數。

若不指定 op 參數,預設會使用 "fix"。例如:

idivide (int8 ([-3, 3]), int8 (4), "fix")

輸出為

ans =

  0  0
idivide (int8 ([-3, 3]), int8 (4), "round")

輸出為

ans =

  -1   1
idivide (int8 ([-3, 3]), int8 (4), "ceil")

輸出為

ans =

  0  1
idivide (int8 ([-3, 3]), int8 (4), "floor")

輸出為

ans =

  -1   0