MATLAB應用介紹

台大生物機電系   馮丁樹教授


陸、函數之應用

一、數值函數

MATLAB中有些特定函數係以數值變數為對象,但處理矩陣時,亦可以矩陣內之項目逐項進行,此類特性之函數稱為數值函數,而較常用者有:

        sin   asin    exp  abs        round
        cos   acos        log(
自然對數)       sqrt        floor
        tan   atan        rem(
餘數)      sign        ceil

以上之相關資訊可有help指令作深入瞭解。

二、向量函數

其他MATLAB 之函數則主要以向量為主(包括行向量與列向量),但亦可應用於矩陣(例如m x n矩陣),將每行之元素進行處理(例如累加),然後將結果置於一個列矩陣中。這些函數如:

        max  sum        median        any
        min  prod        mean        all
        sqrt  norm        std

例如:

>>A=[1 2 3; 4 5 6; 7 8 9] %先假設一個矩陣A
A =
     1     2     3
     4     5     6
     7     8     9
>>max(A)
ans =
     7     8     9
>>max(ans)
ans =
     9

由此例可知,要求矩陣A中之最大元素並不是直接下max(A)之指令,因為那樣僅能獲得一個列向量,故必須下max(max(A)) 之指令才能得到最大元素值(此處為9)。而一個向量之絕對值則可由norm (x)之指令得知。亦即: 

>>norm(ans) % 此處ans為緊接上例之向量
ans =
   16.8481

其絕對值為16.8481,實際上直接對該矩陣Anorm(A)之指令亦可得到同樣的結果:

>>norm(A)  % 矩陣A為上例之內容
ans =
   16.8481

三、矩陣函數

MATLAB之真正功能大半來自處理矩陣之函數。例如:

        eig        特徵值(eigenvalues)與特徵向量(eigenvectors)
        chol        cholesky factorization
        svd        singular value decomposition
        inv       
反矩陣( inverse )
        lu        LU factorization
        qr        QR factorization
        hess        hessenberg form
        schur        schur decomposition
        rref         reduced row echelon form
        expm       
矩陣指數次方
        sqrtm       
矩陣平方根
        poly       
多項數特性矩陣
        det        
行列式值
        size     矩陣之大小
        norm        1-norm, 2-norm, F-norm,  norm
        cond        condition number in the 2-norm
        rank     rank

MATLAB 之函數輸出可能為單項或多項參數,例如:

        y = eig(A), eig(A)

可以產生一個行向量,內含矩陣A之特徵向量(eigenvector)

        [U,D] = eig(A)

將會產生一個矩陣U 其行向量為A之特徵向量及一個矩陣D,其對角元素為A之特徵值。

四、次矩陣與冒號規則

MATLAB 中常使用向量與次矩陣,以獲得較複雜之資料處理效果。冒號規則是應用於矩陣中,產生向量及參考用之次矩陣及向量指標之方式,可以有效表示這些項目之操作。這些符號之創意應用可以減少迴圈之應用,並且使指令內容更為簡潔而且可讀性。在MATLAB中過份倚賴迴圈會使其作業緩慢,故若能多用心認識這種符號的功能,在演算過程中會有很大的幫助。

例如有一個表示法1:5 (前面在討論for迴圈時已介紹過) 實際上是代表一個列向量 [1 2 3 4 5]。這是增量等於1的表示法,故將中間之增量值略而不標明。但這些數字並不一定要為整數,其增量當然也不一定為1。此時其初值,增量及尾值均需寫出,並用冒號隔開,例如:

>>0.2:0.2:1.0
ans =
    0.2000    0.4000    0.6000    0.8000    1.0000

0.2:0.2:1.0代表一個列向量 [0.2 0.4 0.6 0.8 1.0] , 同理

>>10:-2:1
ans =
    10     8     6     4     2

代表一個遞減向量[10 8 6 4 2],但注意其尾值雖設為1,但因1不在其項目之內,故僅能算到2

下面的敘述則可產生一個正弦值(sines)對照表:

>>x=[0.0: 0.1: 2.0]'; y = sin(x); [x, y]

ans =

 

         0         0

    0.1000    0.0998

    0.2000    0.1987

    0.3000    0.2955

    0.4000    0.3894

    0.5000    0.4794

    0.6000    0.5646

    0.7000    0.6442

    0.8000    0.7174

    0.9000    0.7833

    1.0000    0.8415

    1.1000    0.8912

    1.2000    0.9320

    1.3000    0.9636

    1.4000    0.9854

    1.5000    0.9975

    1.6000    0.9996

    1.7000    0.9917

    1.8000    0.9738

    1.9000    0.9463

    2.0000    0.9093

注意正弦函數係以元素為對象,故先將x轉為行向量,以便作成表格供對照。而冒號規則亦可用於拮取矩陣之部份矩陣,例如:

        A(1:4,3) 所指為A矩陣中第三行之開頭四列之部份矩陣。利用冒號亦可以代表整個列或整個行。

        例如:A(:,3)A矩陣中之第三行;而A(1:4,:) 為該矩陣之頭四列。

使用任意整數向量亦可作為指標:

        A(:,[2 4]) 即表示矩陣A中之第二與第四行。

當然這種表示法亦可同時應用在一個陳述之兩邊:

        A(:, [2 4 5]) = B(:, 1:3) 即將A矩陣中第2,4,5行以B矩陣之第13行之內容取代,而所取代過後之A矩陣內容將會顯示一次。 

此種表示法亦可用於矩陣之乘法上,例如A矩陣中之第24行可以與其右邊之2 x 2之矩陣相乘:

>>A=magic(4), A(:,[2,4])=A(:,[2,4])*[1 2; 3 4] %magic()函數製造矩陣A

A =

    16     2     3    13

     5    11    10     8

     9     7     6    12

     4    14    15     1

 

A =

    16    41     3    56

     5    35    10    54

     9    43     6    62

     4    17    15    32

x 為一個n-向量,則x = x(n:-1:1)敘述之結果將會如何呢?

五、使用者自訂函數

MATLAB中,可以輕而易舉地定義自己需要之函數,這點大大增強MATLAB之能力。一個自定的函數為一個M-檔案,其儲存名稱須與函數名稱相同。茲以下面一例作為說明:

  • function y = sinus(t)

  • % calculation of a sine wave of amplitude 20

  • y = 20*sin(0.1*pi*t);

  • 很明顯地,函數檔案中之最初一行中為定義函數之名稱,其格式如下:

            function {輸出變數} = {函數名稱}( {輸入參數} )

    一樣,說明行之前以%開頭。除第一行外,所有函數最開始幾行應為說明行,以敘述該函數之功能及使用方法。若說明行不需佔有全行,則亦可在指令後加%後,隨時作進一步的說明,其情況如下:

    y = 20*sin(0.1*pi*t); % scale y

    函數中所用之變數若不在函數行列出,則應屬區域性變數。若要成為全體性變數則需要宣告(global x)。讓我們看看下面的例子,其中變數a即為區域性變數,將與函數外之參數無關,而變數b則係由外邊輸入,經由呼叫函數傳遞而來,與變數t之情況相同。

  • function y = sinus(t,b)

  • %計算正弦曲線函數

  • a = 20.0;

  • y = a*sin(b*pi*t);

  • 上項例子中,函數之名稱為”sinus”。因此存這一個內容的檔名亦應為”sinus”,或sinus.m。若你要在本文中使用這一個函數計算一個以向量t為輸入時,其用法如下:

  • [t] = 0:0.01:10;

  • b = 0.1;

  • y = sinus(t,b);

  • plot(t,y);

  •  

    這個程式執行之後即可獲得如上之正弦曲線圖,其振幅為20,經歷角度範圍為0-180度。但橫座標y之對應範圍為0-10

    六、公用指令

    1. help 指令

    求助指令help, 是一個相當有用的指令,只要將現有的指令名稱加在help 之後(當然要加一個空格),則可以看到該指令之說明及應用例,包括自己建立之函數檔案亦然(若你事先有作說明的話) MATLAB中,其原始專題均屬於一個目錄名稱MATLABPATH之下。故若就"help” 加上其標題名稱則會顯示出該專題的路徑及內容。此處之標題可為指令名稱或目錄名稱。若為指令,則” help “會顯示該指令之資訊。例如打入如下指令:

    >>help sin

    MATLAB 會出現下面資訊:

    SIN(X) is the sine of the elements of X.

    內容雖為英文,但已經給我們不少信息。若標題為目錄名稱,則會顯示該目錄之內容表。