线性代数Python计算:生成初等矩阵

在这里插入图片描述
numpy的array对象表示的2维数组行标和列标与数学中矩阵的一致,第一个下标为行标,第二个下标为列标。矩阵元素 a i j a_{ij} aij在array对象A中的访问形式为A[i,j]。需要注意的是,数学中矩阵元素的下标——无论是行标还是列标都是从1开始编排的,而numpy的array表示的数组,下标是从0开始编排的。
例1 在Python中生成第一种初等矩阵(即交换单位阵的两行或两列) E 1 ( i , j ) \boldsymbol{E}_1(i,j) E1(i,j),第二种初等矩阵(即用数k乘单位阵的一行或一列) E 2 ( i ( k ) ) \boldsymbol{E}_2(i(k)) E2(i(k))和第三种初等矩阵(即用数 k k k乘单位阵的一行加到另一行上或用数k乘一列加到另一列) E 3 ( i ( k ) , j ) \boldsymbol{E}_3(i(k),j) E3(i(k),j)

import numpy as np                      #导入numpy
def P1(A, i, j, row=True):              #第一种初等变换
    if row:
        A[[i,j]]=A[[j,i]]               #交换两行
    else:
        A[:,[i,j]]=A[:,[j,i]]           #交换两列
def P2(A,i,k, row=True):				#第二种初等变换
    if row:
        A[i]=k*A[i]						#k乘第i行
    else:
        A[:,i]=k*A[:,i]					#k乘第i列
def P3(A,i,j,k,row=True):               #第三种初等变换
    if row:
        A[j]+=k*A[i]                    #k乘以第i行加到第j行
    else:
        A[:,j]+=k*A[:,i]                #k乘以第i列加到第j列

程序中第2~6行定义了交换矩阵A(作为第一个参数)中两行或两列的函数P1,该函数的另两个参数i和j表示需交换的两行(列)的行(列)标,第4个命名参数row,表示进行的是行变换还是列变换,缺省值为True即作行的变换若传递False则意味着作列变换。第3~6行的if-else语句根据参数row传递的值,分别完成交换A的两行或两列的操作。对numpy的数组a,为交换其中两个元素a[i]和a[j],只需作赋值操作:a[[i,j]]=a[[j,i]]。2-维数组A是数组的数组,A的第i行和第j行相当于行标的[i,j]而列标缺省表示所有列,于是交换A的第i行和第j行可用赋值运算
A[[i,j]]=A[[j,i]] \text{A[[i,j]]=A[[j,i]]} A[[i,j]]=A[[j,i]]
(第4行)完成。相仿地,交换两列的操作为
A[:,[i,j]]=A[:,[j,i]] \text{A[:,[i,j]]=A[:,[j,i]]} A[:,[i,j]]=A[:,[j,i]]
(第6行)完成。注意,此处行标作为第一下标不能缺省,用通配符“:”表示所有行。
第7~11行定义了用数k乘矩阵的第i行或第i列的函数P2,其参数A,i及row的意义与P1的相同,参数k表示乘数。第8~11行的if-else语句根据参数row的值完成用k乘以第i行的操作(第9行)
A[i]=k*A[i] \text{A[i]=k*A[i]} A[i]=k*A[i]
或完成用k乘以第i列的操作(第11行)
A[:,i]=k*A[:,i] . \text{A[:,i]=k*A[:,i]}. A[:,i]=k*A[:,i].
第12~18行定义了用数k乘A中第i行加到第j行(k乘第j列加到第i列)的函数P3,参数A,i,j及row的意义与P1的相同,参数k表示参与乘法的数 k k k。第13~18行的if-else语句根据row的值完成k乘以第i行加到第j行的操作(第14行)
A[j]+=k*A[i] \text{A[j]+=k*A[i]} A[j]+=k*A[i]
或完成k乘以第i列加到第j列上的操作(第18行)
A[:,j]+=k*A[:,i]. \text{A[:,j]+=k*A[:,i].} A[:,j]+=k*A[:,i].
可以用下列代码测试函数P1,P2,P3。

import numpy as np                      #导入numpy
E1=np.eye(5)							#5阶单位阵
P1(E1,1,3)								#交换第2、4行
print(E1)
E2=np.eye(5)							#5阶单位阵
P2(E2,2,1.5)							#用1.5乘以第3行
print(E2)
E3=np.eye(5)							#5阶单位阵
P3(E3,1,3,1.5)							#用1.5乘以第2行加到第4行
print(E3)

根据代码内注释信息不难理解程序。运行程序,输出

[[1. 0. 0. 0. 0.]
 [0. 0. 0. 1. 0.]
 [0. 0. 1. 0. 0.]
 [0. 1. 0. 0. 0.]
 [0. 0. 0. 0. 1.]]
[[1.  0.  0.  0.  0. ]
 [0.  1.  0.  0.  0. ]
 [0.  0.  1.5 0.  0. ]
 [0.  0.  0.  1.  0. ]
 [0.  0.  0.  0.  1. ]]
[[1.  0.  0.  0.  0. ]
 [0.  1.  0.  0.  0. ]
 [0.  0.  1.  0.  0. ]
 [0.  1.5 0.  1.  0. ]
 [0.  0.  0.  0.  1. ]]

写博不易,敬请支持:
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!
代码诚可贵,原理价更高。若为AI学,读正版书好

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值