在python里,提到矩阵的运算,一定会提起numpy这个扩展库,这里就不多说。
但有些时候,比如算法题里,不允许使用扩展库,就只能自己来实现矩阵的运算了。比如这一题:
问题描述
给定一个N阶矩阵A,输出A的M次幂(M是非负整数)
例如:
A =
1 2
3 4
A的2次幂
7 10
15 22
输入格式
第一行是一个正整数N、M(1<=N<=30, 0<=M<=5),表示矩阵A的阶数和要求的幂数,接下来N行,每行N个绝对值不超过10的非负整数,描述矩阵A的值
输出格式
输出共N行,每行N个整数,表示A的M次幂所对应的矩阵。相邻的数之间用一个空格隔开
样例输入
2 2
1 2
3 4
样例输出
7 10
15 22
矩阵的乘法
矩阵乘法中第一个矩阵的列要等于第二个矩阵的行
一个m∗n的的A矩阵,和一个n∗p的B矩阵相乘,将得到一个m∗p的矩阵C
Python实现
1.首先输入测试值并初始化矩阵start:
# n = 阶数, m = 幂数
n, m = input().split()
# 将输入的矩阵写入
start = []
for i in range(int(n)):
start.append(input().split())
#print(start)
初始化如下:
2 2
1 2
3 4
[['1', '2'], ['3', '4']]
2.编写原矩阵的“竖排形式”函数:
# 生成“竖排列表”
def vertical(e):
o = []
for j in range(int(n)):
l = []
for k in e:
l.append(k[j])
o.append(l)
return o
#print(vertical(start))
即手算时矩阵A*A,A的行要乘以A的列,这样存储方便for来遍历
[['1', '3'], ['2', '4']]
3.编写矩阵乘法函数
矩阵X*Y
i为X的行,j为Y的每列,列已由vertical函数实现,u为计数下标,n阶就n次
def matrix_multi(x, y):
q = []
for i in x:
p = []
for j in y:
a = 0
for u in range(int(n)):
a = a + int(i[u]) * int(j[u])
p.append(a)
q.append(p)
return q
4.定义一个输出函数,输出矩阵
# 自定义输出
def _print(end_list):
for i in end_list:
for j in i:
print(int(j), end=' ')
print()
5.幂运算,递归
终止条件,当num=2时。
o2为算好的start矩阵的竖列形式
# 幂运算,递归形式
def mi(xx, num):
q2 = matrix_multi(xx, o2)
if num == 2:
_print(q2)
else:
mi(q2, num - 1)
6.程序入口
# 程序的开始
#幂为0时,为单位矩阵E
if m == '0':
EE = []
for ii in range(int(n)):
E = []
for jj in range(int(n)):
if not jj == ii:
E.insert(jj, 0)
else:
E.insert(jj, 1)
EE.append(E)
_print(EE)
elif m == '1':
_print(start)
else:
o2 = vertical(start)
mi(start, int(m))
学生初习算法,若本文有不对之处,或大牛有更优解,或大家对学生有好的建议,敬请赐教,感激不尽