2013年2月26日 星期二

2.MATLAB基本功能介紹

變數
如同上一篇文章所述,由於MATLAB採用直譯方式,因此MATLAB變數不需事先宣告,我們可以在MATLAB敘述裡的任何位置直接指定某個變數來儲存資料或運算結果。
  1. 變數名稱是由英文字母、數字或底線所組成
  2. 開頭的第一個字元必須是英文字母
  3. 名稱長度不能超過63(含)個字元
  4. 會區分大小寫的變數

良好的程式設計
  1. 給變數一個具體且容易記憶的名稱(名字)。
  2. 加上變數名稱的註解。
  3. 以小寫字母命名變數。

與C語言相較
  1. C語言屬於一種高度類型化(Strongly typed)語言
  2. MATLAB屬於一種低度類型化(Weakly typed)語言
陣列
MATLAB裡,儲存資料的基本單位是陣列(Array),陣列可視為一種行列結構的資料,可以是向量(Vector)或矩陣(Matrix)形式的二維資料結構,也可以是多維陣列(Multi-dimensional array)形式的資料結構。若MATLAB的運算結果只是一個純量(Scalar)MATLAB也會將此結果視為二維陣列來處理,只不過它是一個1×1的二維陣
每一個方格中的小括號「( )」內容代表沿列、行或頁的元素索引值編號。例如(2,1,3)即指某個三維陣列的第2列、第1行、第3頁的元素。陣列元素的索引值是由1開始編號,這與C語言的陣列元素索引值由0開始編號不同,熟悉C語言的使用者必須留意。

可以在MATLAB的命令視窗提示符號「>>」之後直接宣告變數的初始值,宣告的格式如下:
            variable = expr
其中variable為變數名稱;expr(expression)可以是純量數值、二維或多維陣列、算數運算式、函式、或是其它變數。陣列須以左、右方括號「[」、「]」來標示陣列的啟始與終止;陣列的列元素可以用逗號「,(comma)或「space(空白)來做區隔;換列時須以分號「;(semicolon)來做換列的宣告(按下Enter鍵亦可)如下範例所示。
>> a=[2.5]                                          %宣告純量變數a,其中方括號可以省略 
a =
     2.5000
此時如同宣告變數a(1,1)等於2.5

>> row=[1 2 3]                                   %宣告列向量變數row 
row =
     1     2     3
此時如同宣告列向量變數row(1,1)=1row(1,2)=2row(1,3)=3 

>> column=[7; 8; 9]                           %宣告行向量變數column
column =
     7
     8
     9
此時如同宣告行向量變數column(1,1)=7column(2,1)=8column(3,1)=9

>> A=[1 3 5; 2 4 6]                              %宣告2×3矩陣變數A
A =
     1     3     5
     2     4     6

>> E(:,:,1)=[0 3 7; -1 0 3];                    %宣告三維陣列變數E
>> E(:,:,2)=[1 3 5; 2 4 6];
>> E(:,:,3)=[8 7 9; -2 3 0]
E(:,:,1) =
     0     3     7
    -1     0     3
E(:,:,2) =
     1     3     5
     2     4     6
E(:,:,3) =
     8     7     9
    -2     3     0

>> b=[]                                                   %宣告變數b為空陣列(Empty array)
b =
     []

矩陣A三維陣列E與純量a列向量row行向量column在陣列中的位置與數值如圖2.4所示。在E(:,:,1)敘述中第一個冒號「:(colon)表示所有的列索引值、第二個冒號「:」表示所有的行索引值,而1代表第一頁,也就是指第一頁的所有元素。此外,號還有其它的用法,將在2.7說明。MATLAB也允許以一維陣列的方式來表示元素個數相同的多維陣列資料,此時一維陣列的索引值是先以多維陣列的行方向開始編號,之後再依序是多維陣列的列方向、頁方向做編號。例如:a(1)=a(1,1)=2.5、row(2)=row(1,2)=2、column(2)=column(2,1)=8、A(2)=A(2,1)=2、A(5)=A(1,3)=5、E(9)=E(1,2,2)=3、E(17)=E(1,3,3)=9一維陣列之索引值如下圖方格的左下角編號 


 注意陣列的每一列每一,以及沿頁方向的元素的個數都必須相同

常用的特殊陣列函式
MATLAB除了有上述的永久常數之外,也提供一些常用的特殊陣列產生函式,可讓使用者能方便建立這些常用的特殊陣列

註1:參數class可以為doublesingleint8int16int32int64uint8uint16uint32以及uint64

>> [0:0.5:1.6]                                           %建構在0~1.6數值間等增量0.5列向量
ans =
         0    0.5000    1.0000    1.5000
>> linspace(0,1.6,4)                               %建構在0~1.6數值間4個等增量列向量
ans =
         0    0.5333    1.0667    1.6000
>> linspace(1.6,0,4)                               %建構在1.6~0數值間4個等減量列向量
ans =
    1.6000    1.0667    0.5333         0
>> freqspace(5)                                      %頻率0~1建立(5+1)/2個等增量向量
ans =
         0    0.4000    0.8000 
>> freqspace(6)                                      %頻率0~1建立6/2+1個等增量向量 
ans =
         0    0.3333    0.6667    1.0000
>> freqspace(4,'whole')                         %在頻率0~2間建立4個等增量列向量
ans =
         0    0.5000    1.0000    1.5000
>> logspace(-1,2,4)                                %在數值10^-1~10^2之間建立4個等比向量
ans =
    0.1000    1.0000   10.0000  100.0000
>> ind=[1 1; 3 2; 2 3; 2 3];                     %建立位置索引值陣列indval計算累加性的陣列A
>> val=[2; 4; 5; 7];
>> A=accumarray(ind,val)
A =
     2     0     0
     0     0    12
     0     4     0
>> eye(3)                                                 %建立3×3的單位矩陣
ans =
     1     0     0
     0     1     0
     0     0     1
>> eye(2,3)                                              %建立主對角線元素為1的2×3的單位矩陣
ans =
     1     0     0
     0     1     0
>> magic(3)                                             %建立3×3的魔術矩陣
ans =
     8     1     6
     3     5     7
     4     9     2
>> ones(2)                                               %建立全為12×2矩陣
ans =
     1     1
     1     1
>> rand(3)                                                %建立元素為均勻分佈在0~13×3矩陣 
ans =
    0.9501    0.4860    0.4565
    0.2311    0.8913    0.0185
    0.6068    0.7621    0.8214
>> randn(2,3)                                           %建立元素為常態分佈的2×3矩陣 
ans =
   -0.4326    0.1253   -1.1465
   -1.6656    0.2877    1.1909
>> zeros(2,3)                                            %建立全為02×3矩陣 
ans =
     0     0     0
     0     0     0
>> x=[1:3];                                                %xy軸向量產生(u,v)對的二維座標矩陣
>> y=0:2;
>> [u,v]=meshgrid(x,y)
u =
     1     2     3
     1     2     3
     1     2     3
v =
     0     0     0
     1     1     1
     2     2     2

此外陣列也可以由鍵盤輸入輸入的方法如下:
            my_value = input('提示語')

下列的陣列訊息函式也常在MATLAB程式中使用
length(A)
取得陣列A最長維的元素個數。若A為空陣列,則得到0
ndims(A)
Number of dimensions縮寫。取得陣列A的維數。
numel(A)
Number of elements縮寫。取得陣列A的元素總數。
size(A)
取得陣列A的列數、行數及頁數。若A為二維以上之陣列,則得到陣列結構大小的列向量值,分別為列個數、行個數、頁個數、
size(Ak)
取得陣列A的結構大小。k=1:取得陣列A的列數;k=2:取得陣列A的行數;k=3:取得陣列A的頁數,以此類推。

>> length(column)                                    %取得向量column列的元素個數
ans =
     3
>> length(A)                                              %取得陣列A最長維的元素個數, 等同於max(size(A))
ans =
     3
>> ndims(A)                                               %取得陣列A的維數
ans =
     2
>> numel(E)                                                %取得陣列E的元素總數
ans =
    18
>> size(E,1)                                                 %取得陣列E的列元素個數
ans =
     2
>> size(E,3)                                                 %取得陣列E的頁元素個數
ans =
     3
>> size(E)                                                    %取得陣列E結構大小,結果為列向量
ans =
     2     3     3


>> rand(1,2)+i*rand(1,2)                              %產生複數的亂數值
ans =   0.8936 + 0.3529i   0.0579 + 0.8132i
>> rand('state', sum(10*clock)), rand(1)     %可依時間產生不同的亂數值
ans =    0.6493
>> rand('state', sum(10*clock)), rand(1)     %可依時間產生不同的亂數值
ans =    0.2169>> randperm(10)                   %整數亂數陣列
ans =     4     6     3     5     9     1    10     2     8     7
>> randperm(10,4)
ans =     3     9     5     2

1.MATLAB工作環境

MATLAB的第一節課裡,介紹了MATLAB工作環境,包含:命令視窗(Command Window)、工作空間瀏覽器(Workspace Browser)、陣列編輯器(Array Editor)、命令歷史(Command History)視窗、路徑瀏覽器(Path Browser)、目前工作目錄(Current Folder)、編輯器(Editor)、工具列、選單列、協助瀏覽器(Help Browser)、繪圖視窗(Figure Window)。
命令視窗(Command Window) 
MATLAB採用直譯方式,只要在命令視窗的提示符號>>之後鍵入正確的 MATLAB命令、M檔程式或M檔程序(以後將這些MATLAB命令、M檔程式或M檔程序稱之為「敘述」),再按下Enter鍵就可以立即對MATLAB敘述逐一進行編譯與執行的處理,並可選擇運算結果是否顯示在命令視窗中,選擇的方式是若在 MATLAB敘述後加上分號(;),命令視窗就不顯示運算結果;反之則會將運算結果顯示在命令視窗中。
例如:
其中ans為MATLAB預設的變數若使用者沒指定變數來儲存運算結果, MATLAB就會自動以ans的變數名稱來儲存。
由於MATLAB採用直譯方式,因此 MATLAB變數不需事先宣告,我們可以在MATLAB敘述裡的任何位置直接指定某個變數來儲存資料或運算結果。 MATLAB變數的名稱是由英文字母、數字或底線字元_所組成,但第一個字元必須為英文字母(大小寫有別),且變數名稱的長度最多只能達63個字元;當變數名稱的長度超過63個字元時,MATLAB會提出警告並將變數名稱自動縮短成63個字元長度 
一個好的程式設計者在撰寫程式時,安排變數名稱都會取一個與運算結果有關的名稱或有意義的名稱來幫助記憶,提高程式的可讀性,日後一看便能立即了解變數的意義維護、修改程式也比較容易例如: 
其中「pi為MATLAB預設的圓周率常數π,這類型的常數稱為永久常數(Permanent Constant),例如:
eps       「epsilon,代表兩個數值之間最小的差異,eps=2.220446049250313e-016
clock     代表現在日期與時間的列向量,其格式為[年  月  日  時  分  秒]。
realmin   為系統的最小值。
realmax  為系統的最大值。
除了變數名稱的命名須注意之外,好的程式設計者也會將變數名稱的註解(data dictionary)放在程式的啟頭位置,而註解的方法是以百分比(%)符號來標示每一行註解的開始;若有多行註解,除了可以在每一行註解的開始都加上%符號以外,也可運用大括號({)(})%符號對多行註解做標示。注意,註解文字在MATLAB的命令視窗與編輯器中會呈現綠色。
在課程中也提及,若指令的敘述無法在一行敘述的範圍內以一行撰寫完畢、或因特殊目的(如撰寫敘述需對齊以利設計者思考等),可在行尾以省略(Ellipsis)符號(…,連續三個點符號)來對MATLAB宣告跨行;並在下一行繼續鍵入未完成的MATLAB敘述,例如:
但仍需注意鍵入省略符號的恰當位置,不可緊接著在數值之後出現省略符號,否則會出現錯誤訊息MATLAB會誤以為第一個點符號為小數點,之後省略符號就少了一個點符號。另外,若連續鍵入超過三個點符號或在三個點符號之後的敘述,MATLAB都會將它視為註解 
 工作空間瀏覽器(Workspace Browser)
我們可運用工作空間瀏覽器觀察目前每一個變數的相關資訊,包括

我們也可以使用who命令與whos命令來查詢已使用的變數名稱及變數的相關資訊
注意,空陣列b不是0,也不是不存在。
陣列編輯器(Array Editor)
若在工作空間瀏覽器點選變數,就會開啟陣列編輯器,此時可以修改變數內容


命令歷史(Command History)視窗
命令歷史視窗紀錄了使用者曾輸入過的命令敘述,使用著若想要執行過去輸入的命令敘述,除了可點擊這些命令敘述,也用上/下方向鍵顯示過去輸入的命令敘述,取代鍵盤的再次輸入

編輯器(Editor)
上述一連串命令敘述也可以使用編輯器將其編寫成檔案,並存成「.m」檔,此檔案稱為程序檔案(Script files),只要在命令視窗中輸入檔名就可以一連串執行這些命令程序
:檔案名稱不要與MATLAB命令函式的檔名相同,並且命名最好要符合程序的功用 

目前工作目錄(Current Folder)
MATLAB會以目前工作目錄當作檔案儲存的目錄目錄裡會顯示該目錄下所有的檔案我們也可在命令視窗中下dir」或「!dir命令用以顯示目前工作目錄下所有的檔案
:驚嘆號「!」這樣的符號是要將後續的命令交由作業系統在命令提示字元視窗(XP或Win 7的小黑)中執行

路徑瀏覽器(Path Browser)
當MATLAB執行時需要呼叫函式,會依照事前安排的路徑搜尋函式,我們可以用路徑瀏覽器來編輯程式執行時路徑搜尋的優先次序

協助瀏覽器(Help Browser)
若操作MATLAB時遇到問題可尋求MATLAB說明文件的協助;除此之外,也可以用「help「lookfor」來協助了解或搜尋命令

File/Preferences選單選項設定命令視窗顯示格式
MATLAB在命令視窗中顯示敘述結果的數值格式有10種、顯示格式有2種,可下 format命令來設定;也可以用File/Preferences選單選項來設定。詳細的格式設定方法可下help format命令來查詢。

什麼人要學MATLAB

MATLAB是MATRIX LABORATORY的縮寫MATLAB是專為工程科學提供解決方法的計算軟體。換言之MATLAB具有相當多樣的函式庫或工具箱(ToolBoxs)來支持這樣的工作。除此之外,使用者也能運用這些函式庫自行設計符合自身工作的程式由於MATLAB的語法簡單使用者在開發程式初期階段就能很快得知演算法(設計的想法)是否正確,相較於C語言MATLAB能讓科學研究的工作效率大幅提升是從事工程科學研究的工作者不可或缺的工具
MATLAB是以陣列(Array)為基本的處理單位,初學者常誤用C語言的方式來處理陣列中元素,以迴圈方式一個元素一個元素的計算造成程式執行效能下降
MATLAB屬於直譯程式 ,執行速度雖比編譯C語言慢,但MATLAB提供C語言的呼叫方法使用者若想要加快執行效能,可以將較為繁瑣的工作以C語言來處理,再運用MATLAB提供的API呼叫這些C語言程式,如此就能提高整體程式的執行執行效能。除此之外,MATLAB也具有一個編譯器,可以將MATLAB程式轉成可獨立執行的應用程式或C語言呼叫的函式庫,提高MATLAB程式的可攜性