矩阵看做是一个系统,使用矩阵可以表示一个线性系统。如使用矩阵表示一个方程组, { x i + 0.2 x j + 0.1 x k + 0.5 x l = 100 − 0.5 x i + x j + 0.2 x k + 0.1 x l = 50 − 0.4 x j − x k + 0.3 x l = 20 − 0.2 x i + x l = 666 \begin{cases}x_i+0.2x_j+0.1x_k+0.5x_l=100\\-0.5x_i+x_j+0.2x_k+0.1x_l=50\\-0.4x_j-x_k+0.3x_l=20\\-0.2x_i+x_l=666\\\end{cases} ⎩⎪⎪⎪⎨⎪⎪⎪⎧xi+0.2xj+0.1xk+0.5xl=100−0.5xi+xj+0.2xk+0.1xl=50−0.4xj−xk+0.3xl=20−0.2xi+xl=666 可以表示为, ( 1 − 0.2 0.1 0.5 − 0.5 − 1 0.2 0.1 0 − 0.4 − 1 0.3 − 0.2 0 0 1 ) ( 100 50 20 666 ) \begin{pmatrix}1&-0.2&0.1&0.5\\-0.5&-1&0.2&0.1\\0&-0.4&-1&0.3\\-0.2&0&0&1\end{pmatrix} \begin{pmatrix}100\\50\\20\\666\end{pmatrix} ⎝⎜⎜⎛1−0.50−0.2−0.2−1−0.400.10.2−100.50.10.31⎠⎟⎟⎞⎝⎜⎜⎛1005020666⎠⎟⎟⎞
上一节中的线型方程组可以使用矩阵和向量表示, ( 1 − 0.2 0.1 0.5 − 0.5 − 1 0.2 0.1 0 − 0.4 − 1 0.3 − 0.2 0 0 1 ) ( x i x j x k x l ) = ( 100 50 20 666 ) \begin{pmatrix}1&-0.2&0.1&0.5\\-0.5&-1&0.2&0.1\\0&-0.4&-1&0.3\\-0.2&0&0&1\end{pmatrix} \begin{pmatrix}x_i\\x_j\\x_k\\x_l\end{pmatrix} =\begin{pmatrix}100\\50\\20\\666\end{pmatrix} ⎝⎜⎜⎛1−0.50−0.2−0.2−1−0.400.10.2−100.50.10.31⎠⎟⎟⎞⎝⎜⎜⎛xixjxkxl⎠⎟⎟⎞=⎝⎜⎜⎛1005020666⎠⎟⎟⎞ 矩阵和向量相乘最终得到的是一个向量, A ⋅ x ⃗ = b ⃗ A\cdot\vec{x}=\vec{b} A⋅x =b *每次从矩阵中取出一个行向量与列向量进行点乘,可以简单表示为, ( a 11 a 12 . . . a 1 n a 21 a 22 . . . a 2 n . . . . . . . . . . . . a m 1 a m 2 . . . a m n ) ⋅ ( u 1 u 2 . . . u n ) = ( a 11 u 1 + a 12 u 2 + . . . + a 1 n u n a 21 u 1 + a 22 u 2 + . . . + a 2 n u n . . . a m 1 u 1 + a m 2 u 2 + . . . + a m n u n ) \begin{pmatrix}a_{11}&a_{12}&...&a_{1n}\\a_{21}&a_{22}&...&a_{2n}\\...&...&...&...\\a_{m1}&a_{m2}&...&a_{mn}\end{pmatrix}\cdot\begin{pmatrix}u_1\\u_2\\...\\u_n\end{pmatrix}=\begin{pmatrix}a_{11}u_1+a_{12}u_2+...+a_{1n}u_n\\a_{21}u_1+a_{22}u_2+...+a_{2n}u_n\\...\\a_{m1}u_1+a_{m2}u_2+...+a_{mn}u_n\end{pmatrix} ⎝⎜⎜⎛a11a21...am1a12a22...am2............a1na2n...amn⎠⎟⎟⎞⋅⎝⎜⎜⎛u1u2...un⎠⎟⎟⎞=⎝⎜⎜⎛a11u1+a12u2+...+a1nuna21u1+a22u2+...+a2nun...am1u1+am2u2+...+amnun⎠⎟⎟⎞ 前提是矩阵的列数与向量的元素个数相同。
对于矩阵的行数没有要求。矩阵与向量的点乘可以看做是矩阵将一个向量转换为另一个向量的过程,所以矩阵实际上可以看做是向量的函数(这一视角非常重要)。
矩阵 A A A和矩阵 B B B的乘法可以将第二个矩阵 B B B拆成多个列向量,进行矩阵 A A A和多个列向量的乘法。要求矩阵 A A A的列数与矩阵 B B B的行数一致。 A ⋅ B = A ⋅ ( ∣ ∣ ∣ c 1 ⃗ c 2 ⃗ . . . c n ⃗ ∣ ∣ ∣ ) = ( ∣ ∣ ∣ A ⋅ c 1 ⃗ A ⋅ c 2 ⃗ . . . A ⋅ c n ⃗ ∣ ∣ ∣ ) A\cdot B=A\cdot \begin{pmatrix}|&|&&|\\\vec{c_1}&\vec{c_2}&...&\vec{c_n}\\|&|&&|\end{pmatrix}=\begin{pmatrix}|&|&&|\\ A\cdot \vec{c_1}&A\cdot \vec{c_2}&...&A\cdot \vec{c_n}\\|&|&&|\end{pmatrix} A⋅B=A⋅⎝⎛∣c1 ∣∣c2 ∣...∣cn ∣⎠⎞=⎝⎛∣A⋅c1 ∣∣A⋅c2 ∣...∣A⋅cn ∣⎠⎞ 等同于, A ⋅ B = ( − r 1 ⃗ − − r 2 ⃗ − . . . − r m ⃗ − ) ⋅ ( ∣ ∣ ∣ c 1 ⃗ c 2 ⃗ . . . c n ⃗ ∣ ∣ ∣ ) = ( r 1 ⃗ ⋅ c 1 ⃗ r 1 ⃗ ⋅ c 2 ⃗ . . . r 1 ⃗ ⋅ c n ⃗ r 2 ⃗ ⋅ c 1 ⃗ r 2 ⃗ ⋅ c 2 ⃗ . . . r 2 ⃗ ⋅ c n ⃗ . . . . . . . . . r m ⃗ ⋅ c 1 ⃗ r m ⃗ ⋅ c 2 ⃗ . . . r m ⃗ ⋅ c n ⃗ ) A\cdot B=\begin{pmatrix}-&\vec{r_1}&-\\-&\vec{r_2}&-\\&...\\-&\vec{r_m}&-\end{pmatrix} \cdot\begin{pmatrix}|&|&&|\\\vec{c_1}&\vec{c_2}&...&\vec{c_n}\\|&|&&|\end{pmatrix}=\begin{pmatrix}\vec{r_1}\cdot\vec{c_1}&\vec{r_1}\cdot\vec{c_2}&...&\vec{r_1}\cdot\vec{c_n}\\\vec{r_2}\cdot\vec{c_1}&\vec{r_2}\cdot\vec{c_2}&...&\vec{r_2}\cdot\vec{c_n}\\...&...&&...\\\vec{r_m}\cdot\vec{c_1}&\vec{r_m}\cdot\vec{c_2}&...&\vec{r_m}\cdot\vec{c_n}\\\end{pmatrix} A⋅B=⎝⎜⎜⎛−−−r1 r2 ...rm −−−⎠⎟⎟⎞⋅⎝⎛∣c1 ∣∣c2 ∣...∣cn ∣⎠⎞=⎝⎜⎜⎛r1 ⋅c1 r2 ⋅c1 ...rm ⋅c1 r1 ⋅c2 r2 ⋅c2 ...rm ⋅c2 .........r1 ⋅cn r2 ⋅cn ...rm ⋅cn ⎠⎟⎟⎞ 但是矩阵乘法不满足乘法交换律,即使是方阵,交换律得到的结果也是不相等的。这一点很重要。
接之前Matrix类代码,
def dot(self, another): """ 返回矩阵乘法结果 :param another: Vector类或Matrix类对象 """ if isinstance(another, Vector): # 保证矩阵的列数与向量的元素数目相同 assert self.col_num() == len(another) return Vector([self.row_vector(i)*another] for i in range(self.row_num())) if isinstance(another, Matrix): assert self.col_num() == another.row_num() return Matrix([[self.row_vector(i).dot(another.col_vector(j)) for j in range(another.col_num())] for i in range(self.row_num())])引入矩阵的幂,对于一个实数而言,其k次幂是k个该数相乘的结果。这对于矩阵也是同理的, A k = A ⋅ A ⋅ . . . A ⎵ k 个 A A^k=\underbrace{A\cdot A\cdot ...A}_{k个A} Ak=k个A A⋅A⋅...A 前提是 A A A是方阵,否则无法计算矩阵的幂。
矩阵的转置实际上就是将矩阵沿着主对角线旋转,将之前的矩阵的列变成新矩阵的行,之前矩阵的行变为新矩阵的列。矩阵转置满足如下性质, ( A T ) T = A (A^T)^T=A (AT)T=A ( A + B ) T = A T + B T (A+B)^T=A^T+B^T (A+B)T=AT+BT ( k ⋅ A ) T = k ⋅ A T (k\cdot A)^T=k\cdot A^T (k⋅A)T=k⋅AT ( A ⋅ B ) T = B T ⋅ A T (A\cdot B)^T=B^T\cdot A^T (A⋅B)T=BT⋅AT 最后一条性质的形式与其他三条不同,给出如下证明, A 是 m ⋅ k 的 矩 阵 , B 是 k ⋅ n 的 矩 阵 A是m\cdot k的矩阵,B是k \cdot n的矩阵 A是m⋅k的矩阵,B是k⋅n的矩阵 A ⋅ B 是 m ⋅ n 的 矩 阵 , A T ⋅ B T 是 n ⋅ m 的 矩 阵 , B T ⋅ A T 是 m ⋅ n 的 矩 阵 A\cdot B是m \cdot n的矩阵,A^T\cdot B^T是n\cdot m的矩阵,B^T\cdot A^T是m\cdot n的矩阵 A⋅B是m⋅n的矩阵,AT⋅BT是n⋅m的矩阵,BT⋅AT是m⋅n的矩阵 转置的实现,
def T(self): """ 返回矩阵的转置矩阵 """ return Matrix([[e for e in self.col_vector(i)] for i in range(self.col_num())])numpy中矩阵和矩阵、矩阵和向量之间的运算使用的都应使用 np.dot 方法。
