前言:一上学好多乱七八糟的事,志愿活动呀,社会实践呀,参加也后悔,不参加也后悔,有了更好的朋友就可以踩着原来的朋友向上吗?【空】。之前矩阵觉得这个挺好的,那么就看看如何进行直接计算吧,这样的话,要是有题的话我就有矩阵计算器了呢。。。
矩阵加法
矩阵加法相比大家都知道的,就那样,话不多说,来吧老铁
# 矩阵相加
A = [[1,3,5],[7,9,11],[13,15,17]]
B = [[9,8,7],[6,5,4],[3,2,1]]
# 这里可以用input形式的输入 很简单 循环一下就好 but我没多写
N = 3
C = [[None]*N for i in range(N)]
# for row in range(N) 表示可将前者进行重复 列表简洁表达
for i in range(3):
for j in range(3):
C[i][j] = A[i][j] + B[i][j]
# 矩阵加法
for i in range(3):
for j in range(3):
# print('%d'%C[i][j],end='\t')
# print('\n')
print('{}\t'.format(C[i][j]),end='')
print('\n')
#两种形式都可以 之后做好了 还可以打包做个美观的界面
矩阵乘法
矩阵之所以有点不好算,部分原因可能就是因为乘法,这里我参考清华大学MOOC没有用到上面的二维列表,如下所示,理论上任意多行都能算,也不知道为什么市面上的计算器为什么都是有限制的
def MatrixMultiply(arrA,arrB,arrC,M,N,P):
# M * N N * P == M*P
if M<=0 or N<=0 or P<=0:
print('!错:M,N,P必须均大于0')
return
for i in range(M):
# 确定首行所乘的东西
for j in range(P):
pos = 0
for k in range(N):
# 确定列 使得所有列均相加
pos += int(arrA[i*N+k])*int(arrB[k*P+j])
# k 可以最后加入
arrC[i*P+j] = pos
# 以下用来制作一维列表格式的脑中假想二维数据
M,N = map(int,(input('请输入矩阵A的维数用逗号分割M,N:').split(',')))
A = [None]*M*N
print('下面请输入A中各元素')
for i in range(M):
for j in range(N):
origin = input('A{}{}='.format(i,j))
flag = 0
try:
if type(eval(origin)) == int or type(eval(origin)) == float:
flag = 1
except:
flag = 0
while flag==0:
origin = input('A{}{}='.format(i,j))
try:
if type(eval(origin)) == int or type(eval(origin)) == float:
flag = 1
except:
flag = 0
A[i*N+j] = origin
# 这里肯定有简单的代码 我暂时脑子短路没想到
# ctrl+C/V 一个B
N,P = map(int,(input('请输入矩阵B的维数用逗号分割N,P:').split(',')))
B = [None]*P*N
print('下面请输入B中各元素')
for i in range(N):
for j in range(P):
originB = input('B{}{}='.format(i, j))
flag = 0
try:
if type(eval(originB)) == int or type(eval(originB)) == float:
flag = 1
except:
flag = 0
while flag == 0:
originB = input('B{}{}='.format(i, j))
try:
if type(eval(originB)) == int or type(eval(originB)) == float:
flag = 1
except:
flag = 0
B[i * P + j] = originB
# 这里卡了好久。。。
# 声明结果C
C = [None]*M*P
MatrixMultiply(A,B,C,M,N,P)
print('[AxB的结果是]')
for i in range(M):
for j in range(P):
print('{}'.format(C[i*P+j]),end='\t')
print('\n')
后来在原型上改了好几次,增加了用户体验,手残党(比如我)直夸好,这里可以全部用函数,但对于只有两个矩阵计算的题似乎打那么多函数比较没意思,就直接枚举了
矩阵转置
众所周知,这很简单
# 输入矩阵方法可以参考乘法,也可以参考下面面的
# arr = []
# r,c = map(int,input('请输入矩阵的行和列逗号分割:').split(','))
# for i in range(r):
# arr.append(input('请用逗号分割一行写入:').split(','))
# print(arr)
arrA = [[1,2,3],[4,5,6],[7,8,9]]
N = 3
arrB = [[None]*N for i in range(N)]
for i in range(N):
for j in range(N):
arrB[j][i] = arrA[i][j]
for i in range(N):
for j in range(N):
print('{}'.format(arrB[i][j]),end='\t')
print()
# 这是我最近才发现的 可以直接print然后自动换行 妙++
矩阵储存
对于0比较多的矩阵比如稀疏矩阵,三角矩阵可以用一维数组来表示二维数组 有空写一写