2021年6月9日 星期三

陣列運算

 陣列運算

源自於http://bime-matlab.blogspot.com/2006/10/blog-post.html

矩陣為一組二維向量之實數或複數之陣列,其加減乘除之運算與一般的數學運算法略有不同,陣列通常以行向量為主,但一般運算仍可混用。即使如此,在線性代數中所定義的矩陣操作大體上
Matlab均能支援。其中諸如一般運算、線性方程、特徵值及單一值與階乘運算等均包括在內。

由於陣列所代表的是一堆有系統的數字,與另一個陣列相運算時,必須依據不同的規則才能獲得
================================
操作名稱       應用情形
---------------------------------
C= A◎B-- ◎處可為加法(+)、減法(-)、乘法(*)、左除(\)、右除(/)
C= A.◎B-- ◎處可為乘法(*)、乘幂(^)、左除(\)、右除(/)
C= A◎c-- ◎處可為加法(+)、減法(-)、乘法(*)、乘幂(^)、右除(/)
C= c◎B-- ◎處可為加法(+)、減法(-)、乘法(*)、乘幂(^)、左除(\)、右除(./)

由表中可知,一個操作元前有一點與沒有一點其意義是不同的。

C= A.◎B     C= A◎B

在操作元前加一點表示是項目與項目間之操作,即為所謂之對映運算方式,此時兩矩陣之大小要相同。這與一般矩陣之加法及減法相同,其運算僅針對元素間之運算。偏置功能則僅適用於矩陣間,不適用於項目間之操作。這些操作元亦可應用於矩陣與一般常數,後者之大小為[1x1]。

矩陣之加減

設C、D分別為3x3之方矩陣,且設C為魔術方塊,D為[1 2 3;4 5 6;7 8 9],即:

 >> C=magic(3)

C =

     8     1     6

     3     5     7

     4     9     2

>> D=[1 2 3;4 5 6;7 8 9]

D =

     1     2     3

     4     5     6

     7     8     9

>> C+D

ans =

     9     3     9

     7    10    13

    11    17    11

 >> C-D

ans =

     7    -1     3

    -1     0     1

    -3     1    -7

>> C*D

ans =

    54    69    84

    72    87   102

    54    69    84

>> C/D

Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND =

1.652118e-18. 

 ans =

   1.0e+16 *

    3.7830   -7.5660    3.7830

    0.0000    0.0000   -0.0000

   -3.7830    7.5660   -3.7830

>> C\D

ans =

    0.0167    0.0833    0.1500

    0.7667    0.8333    0.9000

    0.0167    0.0833    0.1500

C.*D與C*D兩種之運算結果,前者為對應元素相乘;後者為兩個矩陣進行數學相乘:

C =

     8     1     6

     3     5     7

     4     9     2

D =
     1     2     3
     4     5     6
     7     8     9
>>C.*D %對應元素相乘
ans =
8 2 18
12 25 42
28 72 18

>>C*D %矩陣乘法
ans =
54 69 84
72 87 102
54 69 84
例如有一化妝品系列,均由三種原料調配而成,因原料之分量會產生不同產品系列。今設有四種產品,其基本原料分別如有下份量:

>>A=[ 2 4 3; 5 2 1; 7 3 5; 4 5 6]
A =
        2  4  3 %產品1之成分
5 2 1 %產品2之成分
7 3 5 %產品3之成分
4 5 6 %產品4之成分
此時矩陣A代表四種產品(四列)之三種成份量。現設三種成分均有不同的價格,其價格設以一行向量表示,即:
>>P=[120 50 100]' 
P =
120
50
100
矩陣之第一列,其成本只要將A(1,:)與P相乘,即A(1,:)*P,其結果為:
>>A(1,:)*P 
ans = 740
亦即代表產品1的成本,若直接計算應為
  2 x (120) + 4x(50) +3x(100) = 740
結果與上面之A(1,:)*P相同。
故上面四種產品,若以成分矩陣A與價格矩陣P,即可得四種產品之成本:
>>A*P 
ans =
740
800
1490
1330
A之大小為(4x3),P之大小為(3x1),得到的結果為(3x1)
換言之,兩矩陣相乘,第一矩陣之行與第二矩陣之列,其大小應一致。
而結果之大小應為第一矩陣之列與第二矩陣之行,或(4x3)(3x1)=(4x1)。
以通式表示之:
      A[m,n] * B[n,p] = C[m,p]
>>D*C 
ans =
26 38 26
71 83 71
116 128 116

足見D*C與C*D的結果並不同
但只要矩陣之大小相搭配,其分解及分配之特性則仍然存在,如:
  A*(B+C)=A*B + A*C

  (A*B)*C=A*(B*C)
若用eye(3)函數產生單位矩陣,則其無論先乘與後乘,結果都會一樣。
>>I=eye(3) 
I =
1 0 0
0 1 0
0 0 1

>>AA*I
ans =
8 1 6
3 5 7
4 9 2

>>I*AA
ans =
8 1 6
3 5 7
4 9 2
結論是若I為單位矩陣,則I*A=A*I=A,顯示交換律在此情形下仍可成立。

陣列之除法

陣列除法屬逐元除法,因此兩陣列相除時必須同樣大小。例如:
>> a=[2 3 4] 
 a =

     2     3     4 
 >> b=[5 6 7] 
 b =

     5     6     7 
 >> a/b 
 ans =

    0.5091 
 >> a./b 
 ans =

    0.4000    0.5000    0.5714
>> c=[1 2;3 4]
c =
1 2
3 4

>> d=[3 5; 8 7]
d =
3 5
8 7

>> c./d
ans =
0.3333 0.4000
0.3750 0.5714
這是兩陣列經過右除(./)運算之結果
陣列之次方
陣列之逐元運算亦可應用於次方,但其次方數必須為常數,以pascal函數產生之對稱矩陣為例:
>> A=pascal(3)
A =
1 1 1
1 2 3
1 3 6

>> A.^3
ans =
1 1 1
1 8 27
1 27 216

沒有留言:

張貼留言

2024_09 作業3 以Node-Red 為主

 2024_09 作業3  (以Node-Red 為主  Arduino 可能需要配合修改 ) Arduino 可能需要修改的部分 1)mqtt broker  2) 主題Topic (發行 接收) 3) WIFI ssid , password const char br...