python實現基本的矩陣運算

首先聲明矩陣的構建運算均在numpy模塊中由相應的函數,而本文的目的主要是因爲閒的無聊

矩陣及其運算

什麼是矩陣?

  • m×nm{\times}n個  aija_{ij}(i=1,2,{\cdots},m;j=1,2,{\cdots},n) 數排列成的m行n列的數表

A=[a11a12a1na21a22a2nam1am2amn]Amn 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}}

這m×n個數稱爲矩陣A的 元素(元)

矩陣基本運算

加法

  • 兩個m×nm{\times}n的矩陣相加,即對應元素相加

[a11a12a1na21a22a2nam1am2amn]+[b11b12b1nb21b22b2nbm1bm2bmn]=[a11+b11a12+b12a1n+b1na21+b21a22+b22a2n+b2nam1+bm1am2+bm2amn+bmn] \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}

加法滿足:

  1. A+B=B+AA + B = B + A (交換律)
  2. (A+B)+C=A+(B+C)(A + B) + C = A + (B + C) (結合律)

數乘

  • λ\lambda與矩陣AA的乘積記作λA\lambda AAλA \lambda

λA=Aλ=[λa11λa12λa1nλa21λa22λa2nλam1λam2λamn] \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}

數乘滿足:

  1. (λμ)A=λ(μA)(\lambda \mu)A = \lambda (\mu A)λμ\lambda \mu爲常數
  2. (λμ)A=λA+μA(\lambda \mu)A = \lambda A + \mu A
  3. λ(A+B)=λA+λB\lambda (A+B) = \lambda A + \lambda B

乘法

Hadamard乘積

  • 兩個同型矩陣中對應元素乘積,記作ABA\bigodot B

[a11a12a1na21a22a2nam1am2amn]+[b11b12b1nb21b22b2nbm1bm2bmn]=[a11×b11a12×b12a1n×b1na21×b21a22×b22a2n×b2nam1×bm1am2×bm2amn×bmn] \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=(aij)A=(a_{ij})m×sm{\times}s矩陣,B=(bij)B=(b_{ij})s×ns{\times}n矩陣
    規定矩陣AA與矩陣BB的乘積m×nm{\times}n矩陣C=(cij)C=(c_{ij}),其中:

cij=ai1b1j+ai2b2j++aisbsj=k=1saikbkj(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)}

矩陣點積滿足:

  1. (AB)C=A(BC)(AB)C=A(BC)
  2. λ(AB)=(λA)B=A(λB)\lambda (AB) = (\lambda A)B = A(\lambda B)
  3. A(B+C)=AB+AC      (B+C)A=BA+CAA(B+C) = AB + AC \;\;\;(B+C)A = BA + CA
  4. ABBAAB\neq BA
矩陣相乘不滿足交換律

python實現矩陣基本運算思路及代碼

環境

Anaconda 3 + Python 3.6.5 + Jupyter

模塊導入

import numpy as np

加法

思路

  • 參考矩陣加法公式
  1. 先判斷兩矩陣能否相加
  2. 遍歷兩個矩陣
  3. 各相同位置元素相加

實現

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

數乘

思路

  • 參考矩陣數乘公式
  1. 遍歷矩陣
  2. 相乘

實現

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乘積

思路

  • 參考Hadamard乘積公式

與矩陣加法思路一致

實現

# 矩陣對應元素相乘 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列對應元素乘積之和。

  1. 判斷兩矩陣是否爲同型矩陣
  2. 構建m行n列的結果矩陣
  3. 向結果矩陣中賦值:
    (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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章