2013年3月5日 星期二

第三週課程----數值型態

數值型態包括整數、實數與複數,在此將分別介紹它們型態的區別。
整數數值型態
整數型態包括了8-bit整數、無號8-bit整數、16-bit整數、無號16-bit整數、32-bit整數、無號32-bit整數、64-bit整數及無號64-bit整數。可以運用intmin('classname') intmax('classname')函式來查詢各種整數型態的最小值與最大值,其中字串參數classname即為整數型態的類別,例如:uint16。下表呈現各整數型態類別之間的差異。 
        8-bit格式的灰階影像中,每一個像素值都介於0~255之間,因此可以用uint8 的整數型態的變數來儲存8-bit格式灰階影像,如所示。MATLAB Image Toolbox提供imread可以讀取灰階影像檔資料,此時影像資料變數的結構為一uint8矩陣形式。
灰階影像musician.tif

>> x=imread('musician.tif');                        %宣告musician.tif灰階影像資料給變數x 
>> imshow(x)                                               %顯示musician.tif灰階影像
>> whos x 
  Name      Size                    Bytes  Class 
   x       480x300                  144000  uint8 array 
 Grand total is 144000 elements using 144000 bytes

此外,對於24-bit格式的全彩影像(RGB三原色像素值分別佔用8 bits),因此可以用uint8的整數型態變數來儲存24-bit格式的全彩影像,如所示。 imread讀取全彩影像資料,此時影像資料變數的結構為一uint8三維陣列形式。 
 全彩影像bee.tif


>> y=imread('bee.tif');                               %宣告bee.tif全彩影像資料給變數y 
>> imshow(y)                                             %顯示bee.tif全彩影像

>> whos y 
  Name      Size                           Bytes  Class 
   y       300x360x3                       324000  uint8 array 
 Grand total is 324000 elements using 324000 bytes


實數數值型態
實數型態依精確度(Precision)可分成單精度(Single)與雙精度(Double)兩種實數型態。通常MATLAB宣告的變數都是以double的型態呈現。若要了解實數數值在單精度與雙精度下的最小值與最大值,可以運用realmin('classname')函式及 realmax('classname')函式來查詢,其中字串參數classname即為實數型態的類別,如doublesingle呈現實數型態類別之間的差異。
MATLAB允許使用者隨時都能更改變數的數值型態。使用方法是以doublesingle、及其它整數型態類別當指令來更改數值型態。但執行函式運算時就必須注意數值型態的設定。例如要特別指定數值型態為single,在函式運算後其結果將呈現 single型態。
>> a=sqrt(single(8)); whos a 
  Name      Size                    Bytes  Class 
   a         1x1                         4  single array 
 Grand total is 1 element using 4 bytes 

另外,若double型態數值與single型態數值做四則運算時,運算結果會降為single型態,將影響數值運算的精確度。 
>> b=sqrt(single(8))*double(8); whos b 
  Name      Size                    Bytes  Class 
   b         1x1                         4  single array 
 Grand total is 1 element using 4 bytes 

此外,也須注意single型態數值無法與任何整數型態數值做四則運算。 
>> c=sqrt(single(8))*int8(6) 
??? Error using ==> mtimes 
Integers can only be combined with integers of the same class, or scalar doubles.  
>> c=sqrt(single(8))+int32(6) 
??? Error using ==> plus 
Integers can only be combined with integers of the same class, or scalar doubles. 

雖然double型態數值能與整數型態數值(int64uint64除外)做四則運算,但運算結果依然是該整數型態。此時,若運算結果大於該整數型態的最大值時,就會以該整數型態的最大值做為運算結果;若運算結果小於該整數型態的最小值時,就會以該整數型態的最小值做為運算結果。 
>> c=double(8)*uint8(6); whos c 
  Name      Size                    Bytes  Class 
  c         1x1                         1  uint8 array 
 Grand total is 1 element using 1 bytes 

>> c=double(45)*uint8(6)                                       %運算結果大於uint8最大值,以255表示 
c = 
  255 
>> c=double(-45)*uint8(6)                                      %運算結果小於uint8最小值,以0表示 
c = 
    0 
>> c=double(45)*int8(6)                                          %運算結果大於int8最大值,以127表示 
c = 
  127 
>> c=double(-45)*int8(6)                                         %運算結果小於int8最小值,以-128表示 
c = 
 -128 

除了上述情形之外,整數型態(int64uint64除外)也只能與自己一樣的型態做算術運算,運算結果依然是該整數型態。 
>> c=uint8(8)*int8(6) 
??? Error using ==> mtimes 
Integers can only be combined with integers of the same class, or scalar doubles.  
>> c=int32(8)*int32(6), whos c 
c = 
          48 
  Name      Size                    Bytes  Class 
   c         1x1                         4  int32 array  
Grand total is 1 element using 4 bytes  
由上述可知,撰寫MATLAB科學分析的程式(程序)時,必須注意數值型態的設定,以避免運算結果精確度降低或錯誤情形的發生。 

複數數值型態 
複數數值型態的資料在很多科學場合都會用到,當然MATLAB也提供了方便的設定方法,這是一般高階語言所沒有的。在此資料型態下,數值包含實數與虛數兩部分,這兩部分的數值型態雖可以為上述任意一種數值型態,但必須相同,並且所佔用的位元組會為上述各數值型態的兩倍。
>> 2+sqrt(-2)                                                %-2開二次方根可得到一純虛數的數值 
ans = 
   2.0000 + 1.4142i 

沒有留言:

張貼留言