首先聲明矩陣的構建運算均在numpy模塊中由相應的函數,而本文的目的主要是因爲閒的無聊
矩陣及其運算
什麼是矩陣?
由m × n m{\times}n m × n 個 a i j a_{ij} a i j (i=1,2,⋯ {\cdots} ⋯ ,m;j=1,2,⋯ {\cdots} ⋯ ,n) 數排列成的m行n列的數表
A = [ a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋱ ⋮ a m 1 a m 2 ⋯ a m n ] 記 作 A m ∗ n
A=\begin{bmatrix}
{a_{11}} & {a_{12}} & {\cdots} & {a_{1n}}\\
{a_{21}} & {a_{22}} & {\cdots} & {a_{2n}}\\
{\vdots} & {\vdots} & {\ddots} & {\vdots}\\
{a_{m1}} & {a_{m2}} & {\cdots} & {a_{mn}}\\
\end{bmatrix}記作{A_{m*n}}
A = ⎣ ⎢ ⎢ ⎢ ⎡ a 1 1 a 2 1 ⋮ a m 1 a 1 2 a 2 2 ⋮ a m 2 ⋯ ⋯ ⋱ ⋯ a 1 n a 2 n ⋮ a m n ⎦ ⎥ ⎥ ⎥ ⎤ 記 作 A m ∗ n
矩陣基本運算
加法
兩個m × n m{\times}n m × n 的矩陣相加,即對應元素相加
[ a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋱ ⋮ a m 1 a m 2 ⋯ a m n ] + [ b 11 b 12 ⋯ b 1 n b 21 b 22 ⋯ b 2 n ⋮ ⋮ ⋱ ⋮ b m 1 b m 2 ⋯ b m n ] = [ a 11 + b 11 a 12 + b 12 ⋯ a 1 n + b 1 n a 21 + b 21 a 22 + b 22 ⋯ a 2 n + b 2 n ⋮ ⋮ ⋱ ⋮ a m 1 + b m 1 a m 2 + b m 2 ⋯ a m n + b m n ]
\begin{bmatrix}
{a_{11}} & {a_{12}} & {\cdots} & {a_{1n}}\\
{a_{21}} & {a_{22}} & {\cdots} & {a_{2n}}\\
{\vdots} & {\vdots} & {\ddots} & {\vdots}\\
{a_{m1}} & {a_{m2}} & {\cdots} & {a_{mn}}\\
\end{bmatrix}+
\begin{bmatrix}
{b_{11}} & {b_{12}} & {\cdots} & {b_{1n}}\\
{b_{21}} & {b_{22}} & {\cdots} & {b_{2n}}\\
{\vdots} & {\vdots} & {\ddots} & {\vdots}\\
{b_{m1}} & {b_{m2}} & {\cdots} & {b_{mn}}\\
\end{bmatrix}=
\begin{bmatrix}
{a_{11}+b_{11}} & {a_{12}+b_{12}} & {\cdots} & {a_{1n}+b_{1n}}\\
{a_{21}+b_{21}} & {a_{22}+b_{22}} & {\cdots} & {a_{2n}+b_{2n}}\\
{\vdots} & {\vdots} & {\ddots} & {\vdots}\\
{a_{m1}+b_{m1}} & {a_{m2}+b_{m2}} & {\cdots} & {a_{mn}+b_{mn}}\\
\end{bmatrix}
⎣ ⎢ ⎢ ⎢ ⎡ a 1 1 a 2 1 ⋮ a m 1 a 1 2 a 2 2 ⋮ a m 2 ⋯ ⋯ ⋱ ⋯ a 1 n a 2 n ⋮ a m n ⎦ ⎥ ⎥ ⎥ ⎤ + ⎣ ⎢ ⎢ ⎢ ⎡ b 1 1 b 2 1 ⋮ b m 1 b 1 2 b 2 2 ⋮ b m 2 ⋯ ⋯ ⋱ ⋯ b 1 n b 2 n ⋮ b m n ⎦ ⎥ ⎥ ⎥ ⎤ = ⎣ ⎢ ⎢ ⎢ ⎡ a 1 1 + b 1 1 a 2 1 + b 2 1 ⋮ a m 1 + b m 1 a 1 2 + b 1 2 a 2 2 + b 2 2 ⋮ a m 2 + b m 2 ⋯ ⋯ ⋱ ⋯ a 1 n + b 1 n a 2 n + b 2 n ⋮ a m n + b m n ⎦ ⎥ ⎥ ⎥ ⎤
加法滿足:
A + B = B + A A + B = B + A A + B = B + A (交換律)
( A + B ) + C = A + ( B + C ) (A + B) + C = A + (B + C) ( A + B ) + C = A + ( B + C ) (結合律)
數乘
數λ \lambda λ 與矩陣A A A 的乘積記作λ A \lambda A λ A 或A λ A \lambda A λ
λ A = A λ = [ λ a 11 λ a 12 ⋯ λ a 1 n λ a 21 λ a 22 ⋯ λ a 2 n ⋮ ⋮ ⋱ ⋮ λ a m 1 λ a m 2 ⋯ λ a m n ]
\lambda A = A \lambda=\begin{bmatrix}
{\lambda a_{11}} & {\lambda a_{12}} & {\cdots} & {\lambda a_{1n}}\\
{\lambda a_{21}} & {\lambda a_{22}} & {\cdots} & {\lambda a_{2n}}\\
{\vdots} & {\vdots} & {\ddots} & {\vdots}\\
{\lambda a_{m1}} & {\lambda a_{m2}} & {\cdots} & {\lambda a_{mn}}\\
\end{bmatrix}
λ A = A λ = ⎣ ⎢ ⎢ ⎢ ⎡ λ a 1 1 λ a 2 1 ⋮ λ a m 1 λ a 1 2 λ a 2 2 ⋮ λ a m 2 ⋯ ⋯ ⋱ ⋯ λ a 1 n λ a 2 n ⋮ λ a m n ⎦ ⎥ ⎥ ⎥ ⎤
數乘滿足:
( λ μ ) A = λ ( μ A ) (\lambda \mu)A = \lambda (\mu A) ( λ μ ) A = λ ( μ A ) λ μ \lambda \mu λ μ 爲常數
( λ μ ) A = λ A + μ A (\lambda \mu)A = \lambda A + \mu A ( λ μ ) A = λ A + μ A
λ ( A + B ) = λ A + λ B \lambda (A+B) = \lambda A + \lambda B λ ( A + B ) = λ A + λ B
乘法
Hadamard乘積
兩個同型矩陣中對應元素乘積,記作A ⨀ B A\bigodot B A ⨀ B
[ a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋱ ⋮ a m 1 a m 2 ⋯ a m n ] + [ b 11 b 12 ⋯ b 1 n b 21 b 22 ⋯ b 2 n ⋮ ⋮ ⋱ ⋮ b m 1 b m 2 ⋯ b m n ] = [ a 11 × b 11 a 12 × b 12 ⋯ a 1 n × b 1 n a 21 × b 21 a 22 × b 22 ⋯ a 2 n × b 2 n ⋮ ⋮ ⋱ ⋮ a m 1 × b m 1 a m 2 × b m 2 ⋯ a m n × b m n ]
\begin{bmatrix}
{a_{11}} & {a_{12}} & {\cdots} & {a_{1n}}\\
{a_{21}} & {a_{22}} & {\cdots} & {a_{2n}}\\
{\vdots} & {\vdots} & {\ddots} & {\vdots}\\
{a_{m1}} & {a_{m2}} & {\cdots} & {a_{mn}}\\
\end{bmatrix}+
\begin{bmatrix}
{b_{11}} & {b_{12}} & {\cdots} & {b_{1n}}\\
{b_{21}} & {b_{22}} & {\cdots} & {b_{2n}}\\
{\vdots} & {\vdots} & {\ddots} & {\vdots}\\
{b_{m1}} & {b_{m2}} & {\cdots} & {b_{mn}}\\
\end{bmatrix}=
\begin{bmatrix}
{a_{11}{\times}b_{11}} & {a_{12}{\times}b_{12}} & {\cdots} & {a_{1n}{\times}b_{1n}}\\
{a_{21}{\times}b_{21}} & {a_{22}{\times}b_{22}} & {\cdots} & {a_{2n}{\times}b_{2n}}\\
{\vdots} & {\vdots} & {\ddots} & {\vdots}\\
{a_{m1}{\times}b_{m1}} & {a_{m2}{\times}b_{m2}} & {\cdots} & {a_{mn}{\times}b_{mn}}\\
\end{bmatrix}
⎣ ⎢ ⎢ ⎢ ⎡ a 1 1 a 2 1 ⋮ a m 1 a 1 2 a 2 2 ⋮ a m 2 ⋯ ⋯ ⋱ ⋯ a 1 n a 2 n ⋮ a m n ⎦ ⎥ ⎥ ⎥ ⎤ + ⎣ ⎢ ⎢ ⎢ ⎡ b 1 1 b 2 1 ⋮ b m 1 b 1 2 b 2 2 ⋮ b m 2 ⋯ ⋯ ⋱ ⋯ b 1 n b 2 n ⋮ b m n ⎦ ⎥ ⎥ ⎥ ⎤ = ⎣ ⎢ ⎢ ⎢ ⎡ a 1 1 × b 1 1 a 2 1 × b 2 1 ⋮ a m 1 × b m 1 a 1 2 × b 1 2 a 2 2 × b 2 2 ⋮ a m 2 × b m 2 ⋯ ⋯ ⋱ ⋯ a 1 n × b 1 n a 2 n × b 2 n ⋮ a m n × b m n ⎦ ⎥ ⎥ ⎥ ⎤
點積
A = ( a i j ) A=(a_{ij}) A = ( a i j ) 是m × s m{\times}s m × s 矩陣,B = ( b i j ) B=(b_{ij}) B = ( b i j ) 是s × n s{\times}n s × n 矩陣 規定矩陣A A A 與矩陣B B B 的乘積m × n m{\times}n m × n 矩陣C = ( c i j ) C=(c_{ij}) C = ( c i j ) ,其中:
c i j = a i 1 b 1 j + a i 2 b 2 j + ⋯ + a i s b s j = ∑ k = 1 s a i k b k j ( i = 1 , 2 , ⋯ , m ; j = 1 , 2 , ⋯ , n )
\boxed{c_{ij} = a_{i1}b_{1j}+a_{i2}b_{2j}+{\cdots}+a_{is}b_{sj}\\
\quad =\displaystyle \sum^{s}_{k=1}{a_{ik}b_{kj}}(i=1,2,{\cdots},m;j=1,2,{\cdots},n)}
c i j = a i 1 b 1 j + a i 2 b 2 j + ⋯ + a i s b s j = k = 1 ∑ s a i k b k j ( i = 1 , 2 , ⋯ , m ; j = 1 , 2 , ⋯ , n )
矩陣點積滿足:
( A B ) C = A ( B C ) (AB)C=A(BC) ( A B ) C = A ( B C )
λ ( A B ) = ( λ A ) B = A ( λ B ) \lambda (AB) = (\lambda A)B = A(\lambda B) λ ( A B ) = ( λ A ) B = A ( λ B )
A ( B + C ) = A B + A C ( B + C ) A = B A + C A A(B+C) = AB + AC \;\;\;(B+C)A = BA + CA A ( B + C ) = A B + A C ( B + C ) A = B A + C A
A B ≠ B A AB\neq BA A B = B A
python實現矩陣基本運算思路及代碼
環境
Anaconda 3 + Python 3.6.5 + Jupyter
模塊導入
import numpy as np
加法
思路
先判斷兩矩陣能否相加
遍歷兩個矩陣
各相同位置元素相加
實現
def add ( a, b) :
if ( a. shape != b. shape) :
print ( '兩矩陣不爲同型矩陣!' )
return
c = np. zeros( a. shape)
for i in range ( a. shape[ 0 ] ) :
for j in range ( a. shape[ 1 ] ) :
c[ i] [ j] = a[ i] [ j] + b[ i] [ j]
return c
數乘
思路
遍歷矩陣
相乘
實現
def numSub ( a, b) :
c = np. zeros( a. shape)
for i in range ( a. shape[ 0 ] ) :
for j in range ( a. shape[ 1 ] ) :
c[ i] [ j] = a[ i] [ j] * b
return c
Hadamard乘積
思路
與矩陣加法思路一致
實現
def had ( a, b) :
if ( a. shape != b. shape) :
print ( '兩矩陣不爲同型矩陣!' )
return
c = np. zeros( a. shape)
for i in range ( c. shape[ 0 ] ) :
for j in range ( c. shape[ 1 ] ) :
c[ i] [ j] = a[ i] [ j] * b[ i] [ j]
點積
思路
理解公式:乘積C的第m行第n列的元素等於矩陣A的第m行的元素與矩陣B的第n列對應元素乘積之和。
判斷兩矩陣是否爲同型矩陣
構建m行n列的結果矩陣
向結果矩陣中賦值: (1). 遍歷結果矩陣 (2). 求出矩陣A對應行與矩陣B對應列的元素乘積之和: 根據公式,A矩陣的行與B矩陣的列均確定,因此根據累加條件遍歷兩個矩陣來確定另一個索引位置,並累加求和
實現
def mul ( a, b) :
if ( a. shape[ 1 ] != b. shape[ 0 ] ) :
print ( '兩矩陣不能相乘' )
return
m = a. shape[ 0 ]
n = b. shape[ 1 ]
s = a. shape[ 1 ]
c = np. zeros( ( m, n) )
for i in range ( m) :
for j in range ( n) :
for k in range ( s) :
c[ i] [ j] += a[ i] [ k] * b[ k] [ j]
pass
pass
return c