用Python实现矩阵的闭包运算

标题

话不多说,代码如下:
#自反闭包

#自反闭包
m=int(input()) #获得矩阵维度
B=[] #创建一个空列表,用以存放输入矩阵
C=[[0 for i in range(m)] for j in range(m)] #初始化一个列表,用于求R^0^
D=[[0 for i in range(m)] for j in range(m)] #初始化一个列表,用于结果列表的输出
for i in range(m):
    B.append(list(map(int,input().split(" ")))) #获得矩阵并存入B中
for i in range(m):
    C[i][i]=1     #求R^0^
for j in range(m):
    for k in range(m):
        if B[j][k]+C[j][k] >= 1:    #对其进行与运算
            D[j][k]=1               #根据和的结果与1比较来确定输入1或保持原位不变(原位的值为0)
print("r(R):")
for j in range(m):
    for k in range(m):
        print(D[j][k],end=" ")      #输出所求矩阵
    print()                         #确保矩阵以矩阵形式输出

#对称闭包

#对称闭包
m=int(input())
B=[]
C=[[0 for i in range(m)] for j in range(m)]
D=[[0 for i in range(m)] for j in range(m)]
for i in range(m):
    B.append(list(map(int,input().split(" "))))
for j in range(m):
    for k in range(m):
        C[j][k]=B[k][j]        #求其逆运算的矩阵
for j in range(m):
    for k in range(m):
        if B[j][k]+C[j][k] >= 1:
            D[j][k]=1
print("s(R):")
for j in range(m):
    for k in range(m):
        print(D[j][k],end=" ")
    print()

#传递闭包

#传递闭包
m=int(input())
B=[]
for i in range(m):
    B.append(list(map(int,input().split(" "))))
for j in range(m):#列数
    for k in range(m):#行数,放在列数下先对列进行遍历
        if B[k][j] == 1:
            for i in range(m):#对该行每列进行遍历
                if B[k][i]==0 and B[j][i]==0:
                    B[k][i] = 0
                else:
                    B[k][i] = 1
print("t(R):")
for j in range(m):
    for k in range(m):
        print(B[j][k],end=" ")
    print()
#传递闭包的实现原理是算法Warshall

#求一个矩阵的的自反闭包,对称闭包和传递闭包

m=int(input())#获得矩阵的维度
E=[]
for i in range(m):
    E.append(list(map(int,input().split(" "))))#创建一个空列表,并将矩阵转化为二元数组的形式
def r(m):#求自反闭包
    B=E  #局部变量B,避免了定义函数对数组E的处理,避免影响其他函数对E的使用
    C=[[0 for i in range(m)] for j in range(m)]
    D=[[0 for i in range(m)] for j in range(m)]#创建C,D两个m行m列的二元数组
    for i in range(m):
        C[i][i]=1     #创造IA
    for j in range(m):
        for k in range(m):
            if B[j][k]+C[j][k] >= 1:
                D[j][k]=1    #进行与运算,我用数值与1比较来确定填入1还是0
    print("r(R):")
    for j in range(m):
        for k in range(m):
            print(D[j][k],end=" ")#输出自反闭包
        print()
def s(m):#求对称闭包
    B=E  #局部变量B,避免了定义函数对数组E的处理,避免影响其他函数对E的使用
    C=[[0 for i in range(m)] for j in range(m)]
    D=[[0 for i in range(m)] for j in range(m)]#创建C,D两个m行m列的二元数组
    for j in range(m):
        for k in range(m):
            C[j][k]=B[k][j]#进行逆运算
    for j in range(m):
        for k in range(m):
            if B[j][k]+C[j][k] >= 1:
                D[j][k]=1   #进行与运算,我用数值与1比较来确定填入1还是0
    print("s(R):")
    for j in range(m):
        for k in range(m):
            print(D[j][k],end=" ")#输出对称闭包
        print()
def t(m):#求对称闭包
    B=E
    for j in range(m):#列数
        for k in range(m):#行数,行数放在列数下,是为了先列后行进行遍历
            if B[k][j] == 1:
                for i in range(m):#在该行进行列的遍历
                    if B[k][i]==0 and B[j][i]==0:
                        B[k][i] = 0
                    else:
                        B[k][i] = 1#逻辑与运算判断填入1或0
    print("t(R):")
    for j in range(m):
        for k in range(m):
            print(B[j][k],end=" ")#输出传递闭包
        print()
def main():#定义主函数
    r(m)
    s(m)
    t(m)     #对定义函数的运用
main()       #主函数
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值