範圍(Ranges)
範圍(Ranges)的表示法可以很方便的表示一個元素間距離相等的列向量(row vector),其表示方法是以冒號(:
)分隔開始值、間距與結束值,例如要產生 1
到 3
的列向量,元素間的間距為 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;
a
與 b
所產生的列向量是一樣的,但 b
不需要建立一個長度是 10,000,000 的列向量。
範圍表示法無法接受間距為 0
的情況(也就是所有列向量的元素都相同),要產生這樣的列向量可以使用 ones()
函數,例如:
ones(1, 10)
單精度浮點數(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