L1-048矩阵A乘以矩阵B(python)

文章描述了一道关于判断和计算两个矩阵是否可以相乘的编程题。作者参考了他人代码并进行了优化,解决了测试点超时的问题。代码主要涉及矩阵的输入处理,条件判断,以及矩阵乘法的实现。最终,优化后的代码能够正确且高效地完成任务。
摘要由CSDN通过智能技术生成

前言:这是一个PTA中的题目,题目要求具体如下:

即判断两个矩阵是否满足矩阵相乘的条件,满足则计算结果,这里我们先引用某位大佬的代码:

import sys
 
a = sys.stdin.readline().split()
l = []
for i in range(int(a[0])):
    data1 = sys.stdin.readline().split()
    l.append(data1)
 
b = sys.stdin.readline().split()
ll = []
for i in range(int(b[0])):
    data2 = sys.stdin.readline().split()
    ll.append(data2)
 
s2 = []
for i in range(int(b[1])):
    s1 = []
    for j in ll:
        s1.append(j[i])
    s2.append(s1)
 
if a[1] != b[0]:
    print('Error: {} != {}'.format(a[1], b[0]))
else:
    print('{} {}'.format(a[0], b[1]))
    s3 = []
    for i in l:
        for j in s2:
            sum1 = 0
            for z in range(int(a[1])):
                sum1 += int(i[z]) * int(j[z])
            s3.append(sum1)
    count = 0
    for i in s3:
        count += 1
        if count % int(b[1]) == 0:
            print(i)
        else:
            print(i, end=' ')

提交之后发现测试点样例3会有超时的现象,对此我借用了这位大佬代码中的一些想法,对代码加以复杂化(请自动忽略),但是解决了测试点运行超时的情况,提交通过

代码思路如下:

首先对于题目要求,定义函数以判断矩阵是否满足矩阵相乘的条件:

def hege(num1,num2):
    if num1 == num2:
        return True
    else:
        return False

对于主体函数,我们通过列表生成式和split()函数以快速解决输入:

num1=[int(i) for i in input().split()]#接收第一个数组的长宽
num1_list=[]
for i in range(num1[0]):#接收第一个数组的内容
    temp=[eval(i) for i in input().split()]
    num1_list.append(temp)
# print(num1_list)
num2=[int(i) for i in input().split()]#接收第二个数组的长宽
num2_list=[]
for i in range(num2[0]):
    temp=[eval(i) for i in input().split()]#接收第二个数组
    num2_list.append(temp)
#print(num2_list)

接下来通过之前定义的函数判断是否满足矩阵相乘的条件,由于这题不太适合用大循环操作,这里将使用exit()函数对不符合的用例进行退出,代码如下:

if not hege(num1[1],num2[0]):
    print("Error: {} != {}".format(num1[1],num2[0]))
    exit(0)#此处需要以0退出,否则测试用例会报错“返回值非零”

接下来就是设计矩阵乘法部分,此部分纯数学操作,代码如下:

length2=len(num2_list[0])#获取num2_list的元素的长度,便于后续操作
res_list=[]#定义列表存储计算结结果
for i in range(num1[0]):#由于矩阵计算的最终结果矩阵大小为num1[0] * num2[1]
    temp_list=[]#接收a[i][k] * b[k][j]的结果
    for j in range(length2):
        temp=0
        for k in range(num1[1]):
#矩阵相乘,累加一行乘以一列的结果作为res_list的一个元素
            temp += (num1_list[i][k] * num2_list[k][j])
        temp_list.append(temp)
    res_list.append(temp_list)

最后就是输出了,这里较为简单,直接带过,代码如下:

print("{} {}".format(len(res_list),len(res_list[0])))
for i in res_list:
    print(" ".join([str(j) for j in i]))#使用生成式,join函数可作用于字符型列表

最后,如果有小伙伴有其他更好的想法或意见,欢迎评论区留言,完整的代码如下:

def hege(num1,num2):
    if num1 == num2:
        return True
    else:
        return False
num1=[int(i) for i in input().split()]
num1_list=[]
for i in range(num1[0]):
    temp=[eval(i) for i in input().split()]
    num1_list.append(temp)
# print(num1_list)
num2=[int(i) for i in input().split()]
num2_list=[]
for i in range(num2[0]):
    temp=[eval(i) for i in input().split()]
    num2_list.append(temp)
if not hege(num1[1],num2[0]):
    print("Error: {} != {}".format(num1[1],num2[0]))
    exit(0)
# print(num2_list)
length2=len(num2_list[0])
res_list=[]
for i in range(num1[0]):
    temp_list=[]
    for j in range(length2):
        temp=0
        for k in range(num1[1]):
            temp += (num1_list[i][k] * num2_list[k][j])
        temp_list.append(temp)
    res_list.append(temp_list)
print("{} {}".format(len(res_list),len(res_list[0])))
for i in res_list:
    print(" ".join([str(j) for j in i]))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值