15-2 B滮?

一般的加、減、乘、除等四則運算只能用在數值資料,但我們既然創造了多項式物件,就應該要定義這一些同樣適用於多項式操作的基本運算方式。欲達此目的,我們可以藉由定義幾個特殊的函式,來使一般運算元能夠重載(Overloading)到其他物件。

首先,我們定義多項式的加法,可由 plus.m 函式來達成,內容如下:

Example 1: 15-物件導向程式設計/@polynom/plus.mfunction r = plus(p, q) % POLYNOM/PLUS Implement p + q for polynoms. p = polynom(p); q = polynom(q); k = length(q.c) - length(p.c); r = polynom([zeros(1,k) p.c] + [zeros(1,-k) q.c]);

此函式首先檢查輸入參數是否為多項式物件,若不是,先將之轉成多項式物件,這樣的作法讓我們能夠混和多項式和向量來進行加法,例如我們可以使用「p + [1, 1]」來代表將多項式 p 加上 x+1。

多項式的剪法,則可由 minus.m 函式來達成,內容如下:

Example 2: 15-物件導向程式設計/@polynom/minus.mfunction r = minus(p,q) % POLYNOM/MINUS Implement p - q for polynoms. p = polynom(p); q = polynom(q); k = length(q.c) - length(p.c); r = polynom([zeros(1,k) p.c] - [zeros(1,-k) q.c]);

有了這兩個函式之後,我們就可以來測試多項式的加減法,如下:

Example 3: 15-物件導向程式設計/polyPlusMinus01.mp = polynom([3 4 2 1]); q = polynom([-1, 2]); r = p + q s = r + [2, 3] r = 3*x^3 + 4*x^2 + 1*x^1 + 3*x^0 s = 3*x^3 + 4*x^2 + 3*x^1 + 6*x^0

接著我們可以賦予乘法與除法能夠針對多項式物件進行運算,所需定義的函式是 mtimes.m 及 mrdivide.m,內容分別列出如下:

Example 4: 15-物件導向程式設計/@polynom/mtimes.mfunction r = mtimes(p, q) % POLYNOM/MTIMES Implement p*q for polynoms. p = polynom(p); q = polynom(q); r = polynom(conv(p.c, q.c));

Example 5: 15-物件導向程式設計/@polynom/mrdivide.mfunction [q, r] = mrdivide(a, b) % POLYNOM/MRDIVIDE Implement a/b for polynoms. a = polynom(a); b = polynom(b); [q, r] = deconv(a.c, b.c); q = polynom(q); r = polynom(r);

有了這些函式之後,我們就可以對多項式進行加減乘除等四則運算了,請見下列範例:

Example 6: 15-物件導向程式設計/polyTimesDivide01.mp = polynom([1, 1]); q = polynom([1, 2]); r = (p+1)*(q+2) [a, b] = r/[1, 1] r = 1*x^2 + 6*x^1 + 8*x^0 a = 1*x^1 + 5*x^0 b = 0*x^2 + 0*x^1 + 3*x^0

在前述範例中,我們使用 mrdivide.m 用來定義「右除」(例如 p/q),你也可以使用 mldivide.m 來定義「左除」(例如p\q)。此外,你還可以使用 mpower.m 來定義冪方,例如p^n。MATLAB 運算元與物件函式之間的對應關係,請見下表。

運算式M-檔案說明
a+bplus(a,b)二元加法(Binary addition)
+auplus(a)一元加法(Unary plus)
a-bminus(a,b)二元減法(Binary subtraction)
-auminus(a)一元減法(Unary minus)
a.*btimes(a,b)元素對元素之乘法(Element-wise multiplication)
a*bmtimes(a,b)矩陣乘法(Matrix multiplication)
a./brdivide(a,b)元素對元素的右除(Right element-wise division)
a.\bldivide(a,b)元素對元素的左除(Left element-wise division)
a/bmrdivide(a,b)矩陣的右除(Matrix right division)
a\bmldivide(a,b)矩陣的左除(Matrix left division)
a.^bpower(a,b)元素對元素的冪次(Element-wise power)
a^bmpower(a,b)矩陣的冪次(Matrix power)
a < blt(a,b)小於(Less than)
a > bgt(a,b)大於(Greater than)
a <= ble(a,b)小於或等於(Greater than or equal to)
a >= bge(a,b)大於或等於(Less than of equal to)
a~=bne(a,b)不等於(Not equal to)
a==beq(a,b)等於(Equality)
a&band(a,b)邏輯 AND(Logical AND)
a|bor(a,b)邏輯 OR(Logical OR)
~anot(a)邏輯 NOT(Logical NOT)
a:d:b
a:b
colon(a,d,b)
colon(a,b)
冒號運算(Colon operator)
a'ctranspose(a)共軛複數轉置(Complex conjugate transpose)
a.'transpose(a)矩陣轉置(Matrix transpose)
顯示物件於螢幕display(a)顯示物件的方法(Display method)
[a b]horzcat(a, b, ...)水平串接(Horizontal concatenation)
[a; b]vertcat(a, b, ...)垂直串接(Vertical concantenation)
a(s1, s2, ..., sn)subsref(a, s)以下標進行存取(Subscripted reference)
a(s1, s2, ..., sn)=bsubsasgn(a, s, b)以下標進行指定(Subscripted assignment)
b(a)subsindex(a)下標索引(Subscript index)

MATLAB程式設計:進階篇