矩阵运算的python实现

前言:一上学好多乱七八糟的事,志愿活动呀,社会实践呀,参加也后悔,不参加也后悔,有了更好的朋友就可以踩着原来的朋友向上吗?【空】。之前矩阵觉得这个挺好的,那么就看看如何进行直接计算吧,这样的话,要是有题的话我就有矩阵计算器了呢。。。

矩阵加法

矩阵加法相比大家都知道的,就那样,话不多说,来吧老铁

# 矩阵相加
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比较多的矩阵比如稀疏矩阵,三角矩阵可以用一维数组来表示二维数组 有空写一写

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值