顯示具有 第三週課程 標籤的文章。 顯示所有文章
顯示具有 第三週課程 標籤的文章。 顯示所有文章

2013年3月5日 星期二

第三週課程----邏輯運算


>> a=80;m= 'a'>1;n='a'<40;                  %m邏輯型態1n為邏輯型態0 
>> m&n                                                  %1&0=0 
ans = 
     0 
>> ~n                                                      %~0=1 
ans = 
     1 
>> m|n                                                     %1|0=1 
ans = 
     1
  
MATLAB應用裡,數值與數值間也可以做邏輯運算。它是依循邏輯型態轉換方式,將數值0轉換成邏輯0、非0的數值轉換成邏輯1之後,再執行邏輯運算。 
 >> [-1:1]&[-2:0]                                     %[-1:2][-2:0]先轉成[1 0 1][1 1 0]邏輯 
ans = 
     1     0     0 
>> ~[-2:2]                                                %~[1 1 0 1 1] 
ans = 
     0     0     1     0     0 
 除了上述關係與邏輯運算子之外,MATLAB亦提供多個關係與邏輯函式可以做為撰寫程序的應用。下表列出部分關係與邏輯函式,要查這些函式的詳細資料可運用lookfor及help查詢。

第三週課程----關係運算

MATLAB的關係運算可以比較兩個數值、字串或不同型態資料間的大小,包括下表所列之運算子

關係運算的結果是一個邏輯型態。
>> a=80; 'a'>1 
ans = 
     1 
>> 'a'<40 
ans = 
     0 

第三週課程----算術運算符號

除了具有四則運算之外,MATLAB還提供一些特殊的算術運算。若想觀察MATLAB提供的運算及特殊字元(Operators and special characters),包括算術運算(Arithmetic operators)、關係運算(Relational operators)、邏輯運算(Logical operators)、位元運算(Bitwise operators)、集合運算(Set operators)或特殊字元(Special characters冒號、標點、括號等),可以鍵入help opshelp +help .help *等命令,皆可以列出詳細的運算及特殊字元

第三週課程----邏輯型態

如一些高階語言一般,MATLAB也提供了邏輯型態。邏輯型態主要用來呈現邏輯判斷的運算結果,以1代表運算結果為真(True)、以0代表運算結果為假(False)。邏輯型態的變數資料僅需一個位元組來儲存。logical命令可將數值型態的資料轉成邏輯型態,除了數值0會轉換成邏輯0以外,任何非0的數值都會轉換成邏輯1。但logical命令不能針對字元型態的資料做轉換。
>> logical([2.1 0 -5])                                 %任何非0的數都會轉換成邏輯1 
Warning: Values other than 0 or 1 converted to logical 1 
ans = 
     1     0     1 
除此之外,在大型程式或使用者自行定義的程式中,可能會交由不同的使用者來執行或呼叫,引入的參數型態也可能不同。為了能符合不同型態的參數也能順利執行,有時會在程式中讓程式自行偵測輸入的參數型態,以便在不同型態的參數下使用不同的處理程序。偵測變數型態的方法是使用isa(obj,'classname')函式,其中obj為變數名稱,classname為型態的類別。例如:鍵入isa(a,'double')命令,若變數a的型態為double,則回傳1;否則回傳0
>> a=3;                                                       %宣告變數a=3 
>> isa(a,'double')                                      %顯示變數adouble為真 
ans = 
     1 

第三週課程----字元型態

如一些高階語言一般,MATLAB也具有字元型態。字元資料必須分別以左右兩個單引號括起來,每一個字元皆需兩個位元組來儲存,因此也支援中文Big5。 char命令則可將數值型態的資料轉成字元型態,但char命令不能針對邏輯型態的資料做轉換。
>> char(65)                                                %觀察十六進制65字元 
ans = 
A 
>> cha='a', whos cha                                %宣告字元變數cha'a'字元 
cha = 
a 
  Name      Size                    Bytes  Class 
   cha       1x1                         2  char array 
 Grand total is 1 element using 2 bytes 
 >> chb='', whos chb                              %宣告字元變數chb為中文Big5'' 
chb = 
 
  Name      Size                    Bytes  Class 
   chb       1x1                         2  char array 
 Grand total is 1 element using 2 bytes 
 >> dec2hex(cha)                                         %cha的十進制數值轉成十六進制數值 
ans = 
61 
>> double(cha)                                           %cha轉成雙精度數值 
ans = 
    97 
>> single(cha)                                             %cha轉成單精度數值 
ans = 
    97 
>> int8(cha)                                                 %cha轉成int8整數數值 
ans = 
   97 
>> dec2hex(chb)                                         %chb轉成兩個位元組的十六進制數值 
ans = 
8B9A 
>> double(chb)                                           %chb轉成雙精度數值 
ans = 
       35738 
>> s=['Hello,          ';'My name is Jane.']   %宣告字元矩陣需注意字串元素長度要相等 
s = 
Hello,       
My name is Jane. 
>> whos s 
  Name      Size                    Bytes  Class 
   s         2x16                       64  char array

 Grand total is 32 elements using 64 bytes 

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

數值型態包括整數、實數與複數,在此將分別介紹它們型態的區別。
整數數值型態
整數型態包括了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 

第三週課程----資料型態

MATLAB變數的資料型態可以事先指定,也能夠隨時更改型態。
運用help datatypes命令可以來查看MATLAB有那些資料型態。而常用的MATLAB資料型態包括:數值(Numeric)、字元(Character)、邏輯(Logical)、多質(Cell)、結構 (Structure)、函式握把(Function handle)。本章先就數值、字元與邏輯這三個資料型態做說明,而多質、結構與函式握把留待後續再做介紹。

第三週課程----陣列處理函數

部份基本運算函數亦能處理陣列資料