符号运算 - 矩阵乘法

好久没有写点随笔了, 主要是感觉, 有的想法太离谱, 写在这里, 还不如写在科幻小说里面.

最近没事就刷刷力扣, 不过 最近想到一个比较好玩的, 代数运算.
其实代数运算是有实际的使用价值的, 一些数学计算的软件都会集成这样的模块, 辅助科研工作者进行理论研究.

在python里面也提供了sympy 模块.
虽然不支持重复造轮子, 但是我认为应该要有摸轮子的手, 摸都没摸过, 那吃的亏也摸不着.

说会来, 我这里先弄个矩阵乘法运算的模块.

import os

# 矩阵导入
pth = 't_maxi.txt'
maxi = {}
with open(pth) as fr:
    cur = None
    col_i = 0
    row_i = 0
    maxi_row_max = 0
    maxi_col_max = 0
    for l in  fr.readlines():
        l = l.strip()
        if (len(l)>0 and '#' == l[0]):
            continue
        elif len(l)>0 and '=' == l[-1]:
            cur = []
            maxi[l[:-1].rstrip()] = cur

            col_i = 0
            row_i = 0
            maxi_row_max = 0
            maxi_col_max = 0
        elif len(l) == 0:
            row_i = 0
        else:
            row_i += 1
            if maxi_row_max < row_i:
                maxi_row_max += 1
                cur_t = []
                for t in range(maxi_col_max):
                    cur_t.append('0')
                cur.append(cur_t)
            cur[row_i-1].append(l)

# 矩阵打印
def m_print(x):
    print()
    for i in x:
        print(i)
    print('---------------------------')

# 矩阵乘法
def m_mul(x1, x2):
    m_print(x1)
    m_print(x2)

    n,m = len(x1), len(x2[0])

    res = []

    for i in range(n):
        res.append([])
        for j in range(m):
            if len(x1[i]) != len(x2):
                print('error')
                return
            it = []
            for t in range(len(x1[i])):
                it.append('('+x1[i][t]+')*('+x2[t][j]+')')
            res[-1].append('+'.join(it))
    m_print(res)
    return res
    
# 测试
t = m_mul(maxi['T_0_1'], maxi['T_1_2'])
m_mul(t, maxi['T_1_2'])

t_maxi.txt 文件

T_0_1 =

c1
s1
0
0

0
0
1
0

s1
-c1
0
0

0
0
d1
1

T_1_2 =

c2
s2
0
0

-s2
c2
0
0

0
0
1
0

a2c2
a2s2
0
1

输出

['c1', '0', 's1', '0']
['s1', '0', '-c1', '0']
['0', '1', '0', 'd1']
['0', '0', '0', '1']
---------------------------

['c2', '-s2', '0', 'a2c2']
['s2', 'c2', '0', 'a2s2']
['0', '0', '1', '0']
['0', '0', '0', '1']
---------------------------

['(c1)*(c2)+(0)*(s2)+(s1)*(0)+(0)*(0)', '(c1)*(-s2)+(0)*(c2)+(s1)*(0)+(0)*(0)', '(c1)*(0)+(0)*(0)+(s1)*(1)+(0)*(0)', '(c1)*(a2c2)+(0)*(a2s2)+(s1)*(0)+(0)*(1)']
['(s1)*(c2)+(0)*(s2)+(-c1)*(0)+(0)*(0)', '(s1)*(-s2)+(0)*(c2)+(-c1)*(0)+(0)*(0)', '(s1)*(0)+(0)*(0)+(-c1)*(1)+(0)*(0)', '(s1)*(a2c2)+(0)*(a2s2)+(-c1)*(0)+(0)*(1)']
['(0)*(c2)+(1)*(s2)+(0)*(0)+(d1)*(0)', '(0)*(-s2)+(1)*(c2)+(0)*(0)+(d1)*(0)', '(0)*(0)+(1)*(0)+(0)*(1)+(d1)*(0)', '(0)*(a2c2)+(1)*(a2s2)+(0)*(0)+(d1)*(1)']
['(0)*(c2)+(0)*(s2)+(0)*(0)+(1)*(0)', '(0)*(-s2)+(0)*(c2)+(0)*(0)+(1)*(0)', '(0)*(0)+(0)*(0)+(0)*(1)+(1)*(0)', '(0)*(a2c2)+(0)*(a2s2)+(0)*(0)+(1)*(1)']
---------------------------

希望能够实现真正的矩阵运算, 如果稍微成熟了, 我就将整个逻辑开源到 gitee 上, 期待!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值