python分块矩阵,矩阵初等变换,初等方阵

 分块矩阵

A=np.random.randint(0,10,size=(6,6))
A1=A[:3,:3]
A2=A[:3,3:]
A3=A[3:,:3]
A4=A[3:,3:]
B=np.random.randint(0,10,size=(6,6))
B1=B[:3,:3]
B2=B[:3,3:]
B3=B[3:,:3]
B4=B[3:,3:]
# display(A,A1,A2,A3,A4,B,B1,B2,B3,B4)
# A1B1=A1+B1
# A2B2=A2+B2
# A3B3=A3+B3
# A4B4=A4+B4
# D=np.block([[A1B1,A2B2],[A3B3,A4B4]])
# display(A+B,D)
E=np.block([[5*A1,5*A2],[5*A3,5*A4]])
# display(5*A,E)
# 分块矩阵乘法
A1_B1=A1@B1+A2@B3
A2_B2=A1@B2+A2@B4
A3_B3=A3@B1+A4@B3
A4_B4=A3@B2+A4@B4
D=np.block([[A1_B1,A2_B2],[A3_B3,A4_B4]])
# 验证分块矩阵的乘和矩阵整体乘是否一样
display(A@B,D)

A=np.random.randint(0,8,size=(3,3))
B=np.random.randint(0,8,size=(3,9))
B1=B[:,:2]
B2=B[:,2:6]
B3=B[:,6:]
display(A,B,B1,B2,B3)
A_B1=A@B1
A_B2=A@B2
A_B3=A@B3
# 分块乘法,把A当成只有一个块,分别乘B的每一块
D=np.block([A_B1,A_B2,A_B3])
# display(A@B,D)
B.T

矩阵初等变换

A=np.random.randint(0,10,size=(3,4))
display(A)
# 交换两行2,3
A[[1,2]]=A[[2,1]]
display(A)
# 将第二行乘以2倍
A[[1]]*=2
display(A)
# 将第二行的两倍加到第一行上去
A[[0]]+=A[[1]]*2
display(A)
#现在开始逆操作,让A变回最初的A
# 第一行减去第二行的两倍(也即加第二行的-2倍,都一样的)
A[[0]]-=A[[1]]*2
display(A)
# 将第二行整除2
A[[1]]//=2
display(A)
# 交换两行3,2
A[[2,1]]=A[[1,2]]
display(A)

E=np.eye(4)
# 交换两行1,3 交换两行
E[[0,2]]=E[[2,0]]
display(E)
# 将第三行乘以5倍
E[[2]]*=5
display(E)
# 将第四行的3倍加到第一行上去
E[[0]]+=E[[3]]*3
display(E)
#现在开始逆操作,让E变回最初的E
# 第一行减去第四行的3倍(也即加第四行的-3倍,都一样的)
E[[0]]-=E[[3]]*3
display(E)
# 将第三行整除5
E[[2]]//=5
display(E)
# 交换两行31
E[[2,0]]=E[[0,2]]
display(E)

# 我们把单位阵E经过一次初等变换得到的方阵叫做初等方阵
E=np.eye(4)
# 交换两行1,3 记作E(i,j),交换i,j两行
E[[0,2]]=E[[2,0]]
display(E)
E=np.eye(4)
# 将第三行乘以5倍,记作E(i(k)k≠0表示用k乘以第i行
E[[2]]*=5
display(E)
E=np.eye(4)
#将第四行的3倍加到第一行上去,记作E(i,j(k)),表示将第j行的k倍加到第i行
E[[0]]+=E[[3]]*3
display(E)

A=np.arange(1,10)
A=A.reshape(3,3)
A
E=np.eye(3)
E[[1]]*=2
#初等方阵E左乘A会把A第二行乘以2,右乘A会把A第二列乘以2.
# 因为这个初等方阵是单位阵经过第二行乘以k倍得到的
#这说明初等方阵具有传递性
# display(A,E@A,A@E)
E=np.eye(3)
# 交换单位阵的一三行得到的初等方阵
E[[0,2]]=E[[2,0]]
# 初等方阵左乘会交换A的一三行,右乘会交换A的1,3列
#因为初等方阵从列角度看,也可以看成交换了1,3列
# display(A,E@A,A@E)
E=np.eye(3)
# 初等方阵是将第三行乘以3加到第一行上去
E[[0]]+=E[[2]]*3
# 初等方阵在左乘A时把第三行乘以3加到A的第一行
#初等方阵右乘A时是把A的第一列乘以3加到了第三列
#这是因为从初等方阵的列角度看的话,它确实是第一列乘以3
# 加到了第三列
display(E,A,E@A,A@E)

初等变换法求逆矩阵

import numpy as np
A=[1,0,1,2,1,0,-3,2,-5]
A=np.array(A)
A=A.reshape(3,3)
E=np.eye(3)
D=np.block([A,E])

# 第一行乘以-2加到第二行
D[[1]]+=D[[0]]*(-2)
# 第一行乘以3加到第三行
D[[2]]+=D[[0]]*3
# 第二行乘以-2加到第三行
D[[2]]-=D[[1]]*2
D[[2]]/=2
D[[0]]+=D[[2]]*(-1)
D[[1]]+=D[[2]]*2
A_n=D[:,3:]
A_lin_n=np.linalg.inv(A)
# 用初等变换法和numpy方法得到的逆矩阵一致
display(A_n,A_lin_n)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值