天天看點

碼農眼中的數學之~矩陣專欄(附Numpy講解) ¶

吐槽一下:矩陣本身不難,但是矩陣的寫作太蛋疼了 <code>(⊙﹏⊙)汗</code> 還好有<code>Numpy</code>,不然真的崩潰了...

<code>LaTex</code>有沒有一個內建了很多常用<code>公式</code>以及<code>推導</code>或者含<code>題庫</code>的線上編輯器?

代碼褲子:https://github.com/lotapp/BaseCode

線上程式設計系:https://mybinder.org/v2/gh/lotapp/BaseCode/master

數學基礎:https://www.cnblogs.com/dotnetcrazy/p/9294292.html

Numpy基礎:https://www.cnblogs.com/dotnetcrazy/p/9309555.html

線上預覽:http://github.lesschina.com/python/ai/math/矩陣專欄.html

矩陣:是一個按照長方陣列排列的複數或實數集合。

通俗講就是:把數排成m行n列後,然後用中括号把它們包覆,這種形式的組合就是矩陣了~ eg:

$\begin{bmatrix} &amp;a_{11}&amp;a_{12}&amp;a_{13}&amp;...&amp;a_{1n} \\ &amp;a_{21}&amp;a_{22}&amp;a_{23}&amp;...&amp;a_{2n} \\ &amp;a_{31}&amp;a_{32}&amp;a_{33}&amp;...&amp;a_{3n} \\ &amp;\vdots&amp;\vdots&amp;\vdots&amp;\ddots&amp;\vdots\\ &amp;a_{m1}&amp;a_{m2}&amp;a_{m3}&amp;...&amp;a_{mn} \\ \end{bmatrix}$

比如上面這個示例就是一個<code>m × n</code>的矩陣(m行n列的矩陣),如果<code>m=n</code>那麼就叫做<code>n階方陣</code>,eg:

$\begin{bmatrix} 1&amp;2&amp;3 \\ 4&amp;5&amp;6 \\ 7&amp;8&amp;9 \end{bmatrix}$

這個就是<code>3階</code>方陣

如果回到中學,老師肯定都是通過一次方程組來引入矩陣(逆天的老師是這麼講的):

$\begin{cases}x_1+x_2=-1\\2x_1-x_2=4\\3x_1+5x_2=-7\\\end{cases}$ ==&gt; $\begin{bmatrix}1&amp;1\\2&amp;-1\\3&amp;5\end{bmatrix}\begin{bmatrix}x_1\\x_2\end{bmatrix}=\begin{bmatrix}-1\\4\\-7\end{bmatrix}$

如果你方程組都忘記怎麼解的話...好吧還是說下吧:“比如這題,可以先把x2移到右邊,這樣x1就等于一個表達式了(x1=-x2-1),然後帶入第二個表達式就可以解出x1和x2了,一次的其實兩個表達式就可以解出了,剩下的你可以把值帶進去驗證一下”

加減比較簡單,就是對應元素相加減 (隻有<code>行列都相同的矩陣</code>才可以進行)

就不用麻煩的<code>LaTex</code>一行行打了,咱們用更友善的 NumPy 來示範一下矩陣加法(不懂代碼的直接看結果,不影響閱讀的)

Numpy有專門的矩陣函數(np.mat),用法和<code>ndarray差不多</code>,我們這邊使用經常使用<code>ndarray</code>類型,基礎忘記了可以去檢視一下:Numpy基礎

擴充:矩陣的加法運算滿足交換律:A + B = B + A (乘法不行)

In [1]:

In [2]:

In [3]:

Out[3]:

In [4]:

Out[4]:

In [5]:

Out[5]:

In [6]:

In [7]:

In [8]:

In [9]:

這個也比較簡單,就是和每個元素相乘,eg:<code>2×A</code>,A原本的每一個元素都擴大了兩倍

數除其實就是乘以倒數(1/x)

In [10]:

In [11]:

Out[11]:

In [12]:

In [13]:

Out[13]:

矩陣乘法還是要用<code>LaTex</code>示範一下的,不然有些朋友可能還是覺得比較抽象:(大家有什麼好用的LaTex線上編輯器可以推薦的)

拿上面那個方程組來示範一下:

$\begin{bmatrix}1&amp;1\\2&amp;-1\\3&amp;5\end{bmatrix}\begin{bmatrix}x_1\\x_2\end{bmatrix} ==&gt; \begin{cases}x_1+x_2\\2x_1-x_2\\3x_1+5x_2\end{cases}$

稍微變化一下就更形象了:

$\begin{bmatrix}1&amp;1\\2&amp;-1\\3&amp;5\end{bmatrix}\begin{bmatrix}x_1&amp;y_1\\x_2&amp;y_2\end{bmatrix} ==&gt; \begin{cases}x_1+x_2\\2x_1-x_2\\3x_1+5x_2\end{cases} \begin{cases}y_1+y_2\\2y_1-x_2\\3y_1+5y_2\end{cases}==&gt;\begin{bmatrix}x_1+x_2&amp;y_1+y_2\\2x_1-x_2&amp;2y_1-y_2\\3x_1+5x_2&amp;3y_1+5y_2\end{bmatrix}$

舉個簡單的例子:A×B

$\begin{bmatrix} 1&amp;2 \\3&amp;4 \end{bmatrix}\begin{bmatrix} 4&amp;3 \\2&amp;1 \end{bmatrix}=\begin{bmatrix} 1*4+2*2&amp;1*3+2*1 \\3*4+4*2&amp;3*3+4*1 \end{bmatrix}=\begin{bmatrix} 8&amp;5 \\20&amp;13 \end{bmatrix}$

以後記不得怎麼乘就自己推一下,值得注意的是:

兩個矩陣的乘法僅當第一個矩陣A的列數(column)和另一個矩陣B的行數(row)相等才可以進行計算

你這樣想就記得了:$\begin{bmatrix} 1&amp;2 \\3&amp;4 \end{bmatrix}\begin{bmatrix} x_1 \end{bmatrix} 還原成方程組就是這樣\begin{cases}1*x_1+2*?\\3*x_1+4*?\end{cases}\\這是什麼鬼?至少得這樣吧:\begin{bmatrix} 1&amp;2 \\3&amp;4 \end{bmatrix}\begin{bmatrix} x_1 \\x_2 \end{bmatrix}$

In [14]:

In [15]:

Out[15]:

程式驗證了我們上面的運算結果,還得注意一下:

<code>A×B</code>和<code>B×A</code>是不一樣的,eg:B×A

$\begin{bmatrix} 4&amp;3 \\2&amp;1 \end{bmatrix}\begin{bmatrix} 1&amp;2 \\3&amp;4 \end{bmatrix}=\begin{bmatrix} 4*1+3*3&amp;4*2+3*4 \\2*1+1*3&amp;2*2+1*4 \end{bmatrix}=\begin{bmatrix} 13&amp;20 \\5&amp;8 \end{bmatrix}$

如果你乘着乘着就忘記到底怎麼乘,就把右邊的矩陣換成x1,x2,然後就會了

In [16]:

In [17]:

Out[17]:

In [18]:

In [19]:

In [20]:

In [21]:

Out[21]:

幂乘比較簡單,就是每個元素開平方,不一定是方陣

必須是方陣才能進行幂運算,比如<code>A²=A×A</code>(矩陣相乘前提:<code>第一個矩陣A的行=第二個矩陣A的列==&gt;方陣</code>)

In [22]:

In [23]:

Out[23]:

In [24]:

Out[24]:

In [25]:

In [26]:

Out[26]:

In [27]:

來個小結 + 擴充:

矩陣的加法運算滿足交換律:<code>A + B = B + A</code>

矩陣的乘法滿足結合律和對矩陣加法的配置設定律:

結合律:<code>(AB)C = A(BC)</code>

左配置設定律:<code>(A + B)C = AC + BC</code>

右配置設定律:<code>C(A + B) = CA + CB</code>

矩陣的乘法與數乘運算之間也滿足類似結合律的規律;與轉置之間則滿足倒置的

配置設定律:<code>c(A + B) = cA + cB</code>

結合律:<code>c(AB) = (cA)B = A(cB)</code>

矩陣乘法不滿足交換律 一般來說,矩陣A及B的乘積AB存在,但BA不一定存在,即使存在,大多數時候<code>AB ≠ BA</code>

零矩陣就是所有的元素都是0

$ \begin{bmatrix} 0&amp;0&amp;0 \\ 0&amp;0&amp;0 \\ 0&amp;0&amp;0 \end{bmatrix} $

同樣的:全1矩陣就是所有元素都是1

$ \begin{bmatrix} 1&amp;1&amp;1 \\ 1&amp;1&amp;1 \\ 1&amp;1&amp;1 \end{bmatrix} $

Out[2]:

Out[6]:

Out[7]:

Out[8]:

Out[10]:

轉置矩陣 :将矩陣的行列互換得到的新矩陣(行列式不變)

<code>m行×n列</code>的矩陣行和列交換後就變成了<code>n行×m列</code>的矩陣,eg:<code>3行×2列</code> ==&gt; <code>2行×3列</code>

$\begin{bmatrix}1&amp;2 \\3&amp;4 \\5&amp;6\end{bmatrix}^T ==&gt; \begin{bmatrix}1&amp;3&amp;5 \\2&amp;4&amp;6\end{bmatrix}$

矩陣的轉置滿足配置設定律:

$(A + B)^T = A^T + B^T$

$(AB)^T = B^TA^T$

再次提醒:兩個矩陣的乘法僅當第一個矩陣A的列數(column)和另一個矩陣B的行數(row)相等才可以進行計算

上三角矩陣 :主對角線以下都是零的方陣

$\begin{bmatrix} 2&amp;9&amp;4&amp;7 \\ 0&amp;7&amp;3&amp;3 \\ 0&amp;0&amp;6&amp;1 \\ 0&amp;0&amp;0&amp;1 \end{bmatrix}$

下三角矩陣 :主對角線以上都是零的方陣

$\begin{bmatrix} 2&amp;0&amp;0&amp;0 \\ 3&amp;7&amp;0&amp;0 \\ 5&amp;6&amp;7&amp;0 \\ 1&amp;2&amp;3&amp;4 \end{bmatrix}$

性質(行列式後面會說)

上(下)三角矩陣的行列式為對角線元素相乘

上(下)三角矩陣乘以系數後也是上(下)三角矩陣

上(下)三角矩陣間的加減法和乘法運算的結果仍是上(下)三角矩陣

上(下)三角矩陣的逆矩陣也仍然是上(下)三角矩陣

Out[22]:

對角矩陣 :主對角線之外的元素皆為0的方陣 (機關矩陣屬于對角矩陣中的一種)

$\begin{bmatrix}0&amp;0&amp;0 \\0&amp;0&amp;0 \\0&amp;0&amp;0\end{bmatrix} \begin{bmatrix}1&amp;0&amp;0 \\0&amp;1&amp;0 \\0&amp;0&amp;1\end{bmatrix} \begin{bmatrix}2&amp;0&amp;0 \\0&amp;2&amp;0 \\0&amp;0&amp;2\end{bmatrix} \begin{bmatrix}3&amp;0&amp;0 \\0&amp;9&amp;0 \\0&amp;0&amp;6\end{bmatrix}$

擴充:對角矩陣的運算包括和、差運算、數乘運算、同階對角陣的乘積運算,且結果仍為對角陣

而且有意思的是:對角矩陣的矩陣幂運算等于其對應元素的幂運算

$\begin{bmatrix}3&amp;0&amp;0 \\0&amp;9&amp;0 \\0&amp;0&amp;6\end{bmatrix}^n = \begin{bmatrix}3^n&amp;0&amp;0 \\0&amp;9^n&amp;0 \\0&amp;0&amp;6^n\end{bmatrix}$

Out[25]:

In [28]:

In [29]:

Out[29]:

In [30]:

Out[30]:

機關矩陣 :機關矩陣是個方陣(行列相等),從左上角到右下角的對角線(稱為主對角線)上的元素均為1。其他全都為0,eg:

$ \begin{bmatrix} 1&amp;0&amp;0 \\ 0&amp;1&amp;0 \\ 0&amp;0&amp;1 \end{bmatrix} $

任何<code>矩陣</code> x <code>機關矩陣</code> 都等于其<code>本身</code> (反過來也一樣(這個和1×a=a×1一個道理))

In [31]:

Out[31]:

In [32]:

In [33]:

In [34]:

In [35]:

Out[35]:

In [36]:

Out[36]:

對稱矩陣 :元素以主對角線為對稱軸對應相等的方陣

對稱矩陣的轉置是它本身:$A^T=A$

In [37]:

In [38]:

In [39]:

Out[39]:

In [40]:

In [41]:

In [42]:

In [43]:

Out[43]:

逆矩陣 :設A是數域上的一個n階方陣,若在相同數域上存在另一個n階矩陣B,使得:<code>AB=BA=E</code> 則我們稱B是A的逆矩陣(表示為$A^{-1}$),而A則被稱為可逆矩陣

通俗話講就是:原矩陣×逆矩陣=逆矩陣×原矩陣=機關矩陣

可能一看到逆矩陣,大家就想到代數餘子式 ,不過逆天要說的是,代數餘子式就和我們程式員面試題一樣,有些題目就是又繁瑣實際運用又沒多大意義的題目一樣,很多時候面試官都不看面試題一眼,同樣的那些出題老師自己解題一般都不會使用。我這邊介紹一下友善簡單的方法“消元法”

比如求$\begin{bmatrix}3&amp;2 \\1&amp;2\end{bmatrix}^{-1}$,就可以表示為:

$\begin{bmatrix}3&amp;2 \\1&amp;2\end{bmatrix}\begin{bmatrix}x_{11}&amp;x_{12} \\x_{21}&amp;x_{22}\end{bmatrix}=\begin{bmatrix}1&amp;0 \\0&amp;1\end{bmatrix}$

轉換成方程組:

$\begin{cases} \begin{bmatrix}3&amp;2 \\1&amp;2\end{bmatrix}\begin{bmatrix}x_{11} \\x_{21}\end{bmatrix}=\begin{bmatrix}1 \\0\end{bmatrix}\\ \begin{bmatrix}3&amp;2 \\1&amp;2\end{bmatrix}\begin{bmatrix}x_{12} \\x_{22}\end{bmatrix}=\begin{bmatrix}0 \\1\end{bmatrix} \end{cases} ==&gt; 求方程組\begin{cases}3x_{11}+2x_{21}=1\\1x_{11}+2x_{21}=0\end{cases}和\begin{cases}3x_{12}+2x_{22}=0\\1x_{12}+2x_{22}=1\end{cases}的解$

這樣很輕松就能解出逆矩陣了

$\begin{cases}x_{11}=\frac{1}{2}\\x_{21}=-\frac{1}{4} \end{cases}\\\begin{cases}x_{12}=-\frac{1}{2}\\x_{22}=\frac{3}{4} \end{cases}\\ ==&gt; \begin{bmatrix}\frac{1}{2}&amp;-\frac{1}{2} \\-\frac{1}{4}&amp;\frac{3}{4} \end{bmatrix}$

In [44]:

In [45]:

Out[45]:

如果隻是2階方陣,有更簡單的公式(隻能2階使用,而消元法不受限制)矩陣是否可逆就看分母是否為0

$\large{\begin{bmatrix}a_{11}&amp;a_{12} \\a_{21}&amp;a_{22}\end{bmatrix}=\frac{1}{a_{11}a_{22}-a_{12}a_{21}}\begin{bmatrix}a_{22}&amp;-a_{12} \\-a_{21}&amp;a_{11}\end{bmatrix}}$

比如求$\begin{bmatrix}3&amp;2 \\1&amp;2\end{bmatrix}^{-1}$:

$\frac{1}{3×2-2×1}\begin{bmatrix}2&amp;-2 \\-1&amp;3\end{bmatrix}=\begin{bmatrix}\frac{1}{2}&amp;-\frac{1}{2} \\-\frac{1}{4}&amp;\frac{3}{4} \end{bmatrix}$

非方陣可以求 僞逆矩陣 <code>AXA=A,XAX=X</code>

判斷矩陣是否可逆:

$$det\begin{bmatrix}a_{11}&amp;a_{12} \\a_{21}&amp;a_{22}\end{bmatrix}=a_{11}a_{12}-a_{12}a_{21}\\det\begin{bmatrix}a_{11}&amp;a_{12}&amp;a_{13} \\a_{21}&amp;a_{22}&amp;a_{23}\\a_{31}&amp;a_{32}&amp;a_{33}\end{bmatrix}=a_{11}a_{22}a_{33}+a_{12}a_{23}a_{31}+a_{13}a_{21}a_{32}-a_{13}a_{22}a_{31}-a_{12}a_{21}a_{33}-a_{11}a_{23}a_{32}$$

方法很多(比如還可以通過餘子式),公式其實有規律,你可以先摸索下(給個提示):

正負

a11a22

+

a12a21

-

a11a22a33

a11a23a32

a12a21a33

a12a23a31

a13a21a32

a13a22a31

程式比較簡單:<code>np.linalg.det(A)</code>

In [46]:

In [47]:

In [48]:

In [49]:

In [50]:

Out[50]:

In [51]:

Out[51]:

In [52]:

In [53]:

Out[53]:

In [54]:

Out[54]:

In [55]:

Out[55]:

In [56]:

Out[56]:

In [57]:

作者:毒逆天

出處:https://www.cnblogs.com/dotnetcrazy

打賞:<b>18i4JpL6g54yAPAefdtgqwRrZ43YJwAV5z</b>

本文版權歸作者和部落格園共有。歡迎轉載,但必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接!