在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

矩阵的乘法

python快速幂 python幂运算怎么算_算法


python快速幂 python幂运算怎么算_竖排_02


python快速幂 python幂运算怎么算_算法_03


矩阵乘法中第一个矩阵的列要等于第二个矩阵的行

一个m∗n的的A矩阵,和一个n∗p的B矩阵相乘,将得到一个m∗p的矩阵C

python快速幂 python幂运算怎么算_竖排_04


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))

学生初习算法,若本文有不对之处,或大牛有更优解,或大家对学生有好的建议,敬请赐教,感激不尽