10/20/2006

4.3矩陣之應用

矩陣之相乘雖然屬於元素與元素間之相乘,但其結果可能因解釋或其實際之意義而不同。前文所述之陣列相乘即是一種例子,但其結果是相對應位置的元素相乘。這種逐元乘法在Matlab中相當普遍,而通常矩陣的加法、減法是與逐元之加法、減法是一致的,其應用比較簡單。至於矩陣的乘法(或未來的除法)其代表的意義自有不同。

範例一:向量之點積(Dot product)


以向量為例,通常一個向量可以使用三個垂向座標來表示,而各座標之單位向量(其量為一,但方向維持座標方向)若以i、j、k表示,則任一向量V、U可以表示如下:

V=v1 i + v2 j + v3 k;U=u1 i + u2 j + u3 k


今若要求這兩向量間之內積(dot product),則V。U之結果應為各向量同方向之分量之積之和,亦即:


V。U=v1.u1+v2.u2+v3.u3

這個結果若能以矩陣表示,設V=[ v1 v2 v3];U=[ u1 u2 u3] ,則

V。U=v1.u1+v2.u2+v3.u3= [ v1 v2 v3][ u1 u2 u3]'

在MATLAB有一個點積指令稱為dot(),其指令型式如下:

dot(U,V)

假設:V=[ 25 4 50]; U=[15 20 5],結果:


>>V.U=[25 4 50]*[15 20 5]'
ans =
705
>> [15 20 5]*[25 4 50]' %即使順序掉換,其結果亦相同。
ans =
705

>> [25 4 50]'*[15 20 5] %但是這樣掉換,其結果完全不同。
ans =
375 500 125
60 80 20
750 1000 250


上述的例子中,使用點積指令亦可得到同樣的結果:


>> dot([25 4 50],[15 20 5])

ans =

705

>> dot([25 4 50],[15 20 5]')

ans =

705



因此,若利用點積指令,也可以求得某特定向量之絕對值如下:


>> r=sqrt(dot([25 4 50],[25 4 50]))

r =

56.0446

>> u=[25 4 50]/r

u =

0.4461 0.0714 0.8921


上述u則為該向量之單位向量了。

範例二:叉積指令(Cross)


兩向量間之叉積在於求得兩向量所構成之垂向面積,而其方向則是垂直於該面積之正方向。例如扭矩等於力與力臂之叉積,而其方向則在於共同垂直於此二向量之方向。叉積之指令型式為:

M=cross(R,F)

設有A向量沿x軸,其向量值為A=1i,以向量陣列表示為A=[1 0 0];B為沿y方向,其向量值B=2j,或B=[0 2 0];則結果向量D應為:

D=AxB (注意此處x號為叉積或cross的意思,不要與矩陣之*混淆),則


>> A=[1 0 0];B=[0 2 0];
>> D=cross(A,B)

D =

0 0 2


其結果在z方向,其值為2。
若兩向量均不在特別之座標上,則結果也可能在空間上,例如:


>> m=cross([1 2 3],[5 4 3])

ans =

-6 12 -6


至於要求得m之絕對值,則有下列方法:


>> r2=sqrt(m*m')

r2 =

14.6969

>> r2=sqrt(dot(m,m))

r2 =

14.6969


兩者均可得到相同的答案,則如何求其單位向量,相信應更容易了。

範例三:九九乘法表


例如:製造一個九九乘法表,其方法可以利用上述的用法迅速得到答案:

>> A=[1:9];Table=A'*A
Table =
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81



同理,試算出一長L=[2 4 6 8 10]m、寬W=[1 2 3 4 5]m所構成之組合及其對應之重量。設密度為10kg/cm^3 。


>> Weight=[2:2:8]'*[1:5]*10

Weight =
20 40 60 80 100
40 80 120 160 200
60 120 180 240 300
80 160 240 320 400


範例四:生產成本分析


某工廠件生產三件主力產品A、B、C三種。生產過程中,其材料、勞力、設備及運輸等之單位產品成本亦自不同。設每樣產品一年分四季生產,其售價亦四季不同,求其每季之生產成本、單項產品之生產成本、單項產品之銷售及利潤等。其相關資料如下:

單位生產成本,P(NT$)




產品名材料 設備人力運輸
100226512
5015805
200305020


每季生產量,Q單位




產品名第一季第二季第三季第四季
10020025090
250200150100
80100120150


每季售價格,W(NT$)




產品名第一季第二季第三季第四季
300250250200
400350250150
500600650700


先將三種資料輸入P、Q、W等三個矩陣,其大小均為(3x4):但Q之四項與P之四項並不屬同性質,故即使矩陣之大小配合,也須注意不能隨意相乘。


>>P=[100 22 65 12;50 15 80 5;200 30 50 20];
>>Q=[100 200 250 90;250 200 150 100;80 100 120 150];
>>W=[300 250 250 200; 400 350 250 150;500 600 650 700];


輸入後之值如下:


>>P %單位成本
P =
100 22 65 12
50 15 80 5
200 30 50 20 Q %每季生產量

>>Q =
100 200 250 90
250 200 150 100
80 100 120 150 W %每季之產品價格

>>W =
300 250 250 200
400 350 250 150
500 600 650 700



為求得每季之生產成本,可用C=P'*Q 計算,其大小之型式為(4x4)=(4x3)(3x4)。結果為4x4,其列為材料、設備、人力及運輸之成本,行向為四季。注意前者P用移置功能,主要將其大小轉為符合矩陣之乘法:


>>C=P'*Q
C =
38500 50000 56500 44000
8350 10400 11350 7980
30500 34000 34250 21350
4050 5400 6150 4580



上式C矩陣為四季之成本,若將材料、設備、人力及運輸成本合計,則各季之成本小計可用sum函數計算:


>>Qcost=sum(C)
Qcost =
81400 99800 108250 77910


Qcost為四季之成本,若需要總成本,則需再用一次sum函數:


>>Total_cost=sum(Qcost)
Total_cost =
367360


其次要計算單項產品之成本時,可利用原來之P矩陣。因為其列為產品名稱,行為分項成于,故若列向相加,應可得各項產品之單位成本,其法可利用sum函數,但其第二參數應輸入2,表示以列向(橫向)相加:


>>Prod_unitcost=sum(P,2)
Prod_unitcost =
199
150
300


同樣,對生產量Q而言,由於其行向屬不同季節,若將其合併,應為一年之總生產量,故仍然應用sum函數,但記得其第二參數為2:


>>Prod_Q=sum(Q,2)
>>Prod_Q =
640
700
450


有了單位總生產成本Prod_unitcost及年生產量Prod_Q,即可直接用元素對應元素乘法,求得其總成本。注意此時之操作元乘號前須加點,即.* 。


>>Prod_cost=Prod_unitcost.*Prod_Q
Prod_cost =
127360
105000
135000


Prod_cost 即為年生產總成本。其次要求得年銷售金額,此時因為Q與W矩陣之行向同為季別,故只要使用元素對元素之乘法即可。其四季之銷售量D=Q.*W:


>>D=Q.*W
D =
30000 50000 62500 18000
100000 70000 37500 15000
40000 60000 78000 105000


目前為求得各項產品之銷售金額,故只要每項產品之四季金額相加即可,此時仍使用sum函數,其第二輸入參數仍設定為2:


>>Prod_sale=sum(D,2)
Prod_sale =
160500
222500
283000


Prod_sale為全年三種產品之銷售金額。扣除上項得到之成本Prod_cost,即為利潤Profit:


>>Profit=Prod_sale-Prod_cost
Profit =
33140
117500
148000


綜合判斷,C產品之獲利較高;B產品次之。讀者可就四季所得之利潤進行分析,其結果應更具參考性。