线性代数Python计算:矩阵的乘法

在这里插入图片描述
n , m , l ∈ n,m,l\in n,m,lℕ, P P P为一数域。
∀ A = ( a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋯ ⋮ a m 1 a m 2 ⋯ a m n ) ∈ P m × n \forall\boldsymbol{A}=\begin{pmatrix}a_{11}&a_{12}&\cdots&a_{1n}\\ a_{21}&a_{22}&\cdots&a_{2n}\\ \vdots&\vdots&\cdots&\vdots\\ a_{m1}&a_{m2}&\cdots&a_{mn}\end{pmatrix}\in P^{m\times n} A= a11a21am1a12a22am2a1na2namn Pm×n B = ( b 11 b 12 ⋯ b 1 l b 21 b 22 ⋯ b 2 l ⋮ ⋮ ⋯ ⋮ b n 1 b n 2 ⋯ b n l ) ∈ P n × l \boldsymbol{B}=\begin{pmatrix}b_{11}&b_{12}&\cdots&b_{1l}\\ b_{21}&b_{22}&\cdots&b_{2l}\\ \vdots&\vdots&\cdots&\vdots\\ b_{n1}&b_{n2}&\cdots&b_{nl}\end{pmatrix}\in P^{n\times l} B= b11b21bn1b12b22bn2b1lb2lbnl Pn×l,定义 A \boldsymbol{A} A B \boldsymbol{B} B的积运算 ∘ \circ 为:
C = A ∘ B = ( ∑ k = 1 n a 1 k b k 1 ∑ k = 1 n a 1 k b k 2 ⋯ ∑ k = 1 n a 1 k b k l ∑ k = 1 n a 2 k b k 1 ∑ k = 1 n a 2 k b k 2 ⋯ ∑ k = 1 n a 2 k b k l ⋮ ⋮ ⋯ ⋮ ∑ k = 1 n a m k b k 1 ∑ k = 1 n a m k b k 2 ⋯ ∑ k = 1 n a m k b k l ) m × l ∈ P m × l . \boldsymbol{C}=\boldsymbol{A}\circ\boldsymbol{B}=\begin{pmatrix}\sum\limits_{k=1}^na_{1k}b_{k1}&\sum\limits_{k=1}^na_{1k}b_{k2}&\cdots&\sum\limits_{k=1}^na_{1k}b_{kl}\\ \sum\limits_{k=1}^na_{2k}b_{k1}&\sum\limits_{k=1}^na_{2k}b_{k2}&\cdots&\sum\limits_{k=1}^na_{2k}b_{kl}\\ \vdots&\vdots&\cdots&\vdots\\ \sum\limits_{k=1}^na_{mk}b_{k1}&\sum\limits_{k=1}^na_{mk}b_{k2}&\cdots&\sum\limits_{k=1}^na_{mk}b_{kl}\end{pmatrix}_{m\times l}\in P^{m\times l}. C=AB= k=1na1kbk1k=1na2kbk1k=1namkbk1k=1na1kbk2k=1na2kbk2k=1namkbk2k=1na1kbklk=1na2kbklk=1namkbkl m×lPm×l.
在不会产生混淆的情况下,常常省略运算符 ∘ \circ ,即将 A ∘ B \boldsymbol{A}\circ\boldsymbol{B} AB简写成 A B \boldsymbol{A}\boldsymbol{B} AB
Python的乘法运算符“∗”不能用于矩阵的乘法——因为该运算符已经被用于numpy的array数组的按元素乘法计算了。numpy的matmul函数实现矩阵的乘法运算。

例1 分别就实数域ℝ上的矩阵
(1) A = ( 4 − 1 2 1 1 1 0 3 0 3 1 4 ) \boldsymbol{A}=\begin{pmatrix}4&-1&2&1\\1&1&0&3\\0&3&1&4\end{pmatrix} A= 410113201134 B = ( 1 2 0 1 3 0 − 1 4 ) \boldsymbol{B}=\begin{pmatrix}1&2\\0&1\\3&0\\-1&4\end{pmatrix} B= 10312104 ,计算 A B \boldsymbol{A}\boldsymbol{B} AB
(2) A = ( 2 1 4 0 1 − 1 3 4 ) \boldsymbol{A}=\begin{pmatrix}2&1&4&0\\1&-1&3&4\end{pmatrix} A=(21114304) B = ( 1 3 0 − 1 1 − 3 4 0 ) \boldsymbol{B}=\begin{pmatrix}1&3\\0&-1\\1&-3\\4&0\end{pmatrix} B= 10143130 ,计算 A B \boldsymbol{A}\boldsymbol{B} AB B A \boldsymbol{B}\boldsymbol{A} BA
(3) A = ( − 2 4 1 − 2 ) \boldsymbol{A}=\begin{pmatrix}-2&4\\1&-2\end{pmatrix} A=(2142) B = ( 2 4 − 3 6 ) \boldsymbol{B}=\begin{pmatrix}2&4\\-3&6\end{pmatrix} B=(2346),计算 A B \boldsymbol{A}\boldsymbol{B} AB B A \boldsymbol{B}\boldsymbol{A} BA
:见下列代码

import numpy as np          #导入numpy
A=np.array([[4,-1,2,1],     #设置矩阵A
            [1,1,0,3],
            [0,3,1,4]])
B=np.array([[1,2],          #设置矩阵B
            [0,1],
            [3,0],
            [-1,4]])
print(np.matmul(A,B))       #计算积AB
A=np.array([[2,1,4,0],      #设置矩阵A
            [1,-1,3,4]])
B=np.array([[1,3],          #设置矩阵B
            [0,-1],
            [1,-3],
            [4,0]])
print(np.matmul(A,B))       #计算积AB
print(np.matmul(B,A))       #计算积BA
A=np.array([[-2,4],         #设置矩阵A
            [1,-2]])
B=np.array([[2,4],          #设置矩阵B
            [-3,6]])
print(np.matmul(A,B))       #计算积AB
print(np.matmul(B,A))       #计算积BA

程序中第2~9、第10~17和第18~23行分别计算(1)、(2)和(3)。仅以第10~17行的代码加以说明,其他的读者可参照自行研读。第10~11行和第12~15行分别设置矩阵 A \boldsymbol{A} A B \boldsymbol{B} B。第16行调用numpy的矩阵乘法计算函数
matmul(A, B) \text{matmul(A, B)} matmul(A, B)
计算矩阵的积 A B \boldsymbol{AB} AB,并输出。第17行调用函数
matmul(B, A) \text{matmul(B, A)} matmul(B, A)
计算矩阵的积 B A \boldsymbol{BA} BA。运行程序,输出:

[[ 9 11]
 [-2 15]
 [-1 19]]
[[ 6 -7]
 [20 -5]]
[[  5  -2  13  12]
 [ -1   1  -3  -4]
 [ -1   4  -5 -12]
 [  8   4  16   0]]
[[-16  16]
 [  8  -8]]
[[  0   0]
 [ 12 -24]]

由本例可见,矩阵的乘法不满足交换律。
例2 ℝ上矩阵 A = ( 1 2 3 4 5 6 7 8 9 ) \boldsymbol{A}=\begin{pmatrix}1&2&3\\4&5&6\\7&8&9\end{pmatrix} A= 147258369 ,初等矩阵 E 1 ( 1 , 2 ) , E 2 ( 2 ( 1 / 2 ) ) , E 3 ( 2 ( 1 / 2 ) , 1 ) ∈ \boldsymbol{E}_1(1,2),\boldsymbol{E}_2(2(1/2)),\boldsymbol{E}_3(2(1/2),1)\in E1(1,2),E2(2(1/2)),E3(2(1/2),1) 3 × 3 ^{3\times3} 3×3为第一、二、三种初等矩阵(见博文《生成初等矩阵》)。用 E 1 ( 1 , 2 ) , E 2 ( 2 ( 1 / 2 ) ) , E 3 ( 2 ( 1 / 2 ) , 1 ) \boldsymbol{E}_1(1,2),\boldsymbol{E}_2(2(1/2)),\boldsymbol{E}_3(2(1/2),1) E1(1,2),E2(2(1/2)),E3(2(1/2),1)分别左乘、右乘 A \boldsymbol{A} A

import numpy as np
from fractions import Fraction as F
np.set_printoptions(formatter={'all':lambda x:
                               str(F(x).limit_denominator())})
A=np.array([[1,2,3],
            [4,5,6],
            [7,8,9]])
E1=np.eye(3)
P1(E1,0,1)
print(np.matmul(E1,A))
print(np.matmul(A,E1))
E2=np.eye(3)
P2(E2,1,1/2)
print(np.matmul(E2,A))
print(np.matmul(A,E2))
E3=np.eye(3)
P3(E3,1,0,1/2)
print(np.matmul(E3,A))
print(np.matmul(A,E3))

程序的第5~7行设置矩阵A。第8~11行、第12~15行和第16~19行分别用函数P1,P2,P3(见博文《生成初等矩阵》)设置初等矩阵E1,E2,E3。并分别左乘、右乘A。程序的第2~4行设置数组输出格式为有理数。运行程序,输出

[[4 5 6]
 [1 2 3]
 [7 8 9]]
[[2 1 3]
 [5 4 6]
 [8 7 9]]
[[1  2  3]
 [2 5/2 3]
 [7  8  9]]
[[1  1  3]
 [4 5/2 6]
 [7  4  9]]
[[3 9/2 6]
 [4  5  6]
 [7  8  9]]
[[1  5/2 3]
 [4   7  6]
 [7 23/2 9]]

由此可见,用初等矩阵左乘A,相当于对A作相应的行初等变换;右乘A,相当于对A作列初等变换。
写博不易,敬请支持:
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!
代码诚可贵,原理价更高。若为AI学,读正版书好

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值