[PYTHON] Calculer le produit des matrices avec une expression de caractère?

Si vous étiez en train d'étudier la rotation 3D et le filtre de Kalman pour jouer avec IMU de M5StickC Il semble que vous ne pouvez pas vous échapper de la file d'attente, ou il est plus facile d'utiliser la file d'attente, ça sent comme ça. J'ai googlé même la pile de lignes au-delà de ma mémoire ... Il est gênant de jouer avec la formule pour ne pas faire d'erreur, j'ai donc essayé de faire un programme qui génère le produit de la formule matricielle contenant la formule telle qu'elle est, également en tant qu'étude de python (rires)

Postscript: j'ai également essayé de prendre en charge les opérateurs (* (y compris les temps scalaires), +, -). Le calcul fixe s'affiche comme une calculatrice Seulement le produit, le produit avec le scalaire et la somme / différence, mais je l'ai essayé en premier. Addendum 2: Il est difficile de trouver et de supprimer les termes inutiles dans une matrice mélangée avec 0 et 1, j'ai donc essayé de supprimer autant que possible et de le fournir.

##########\python>matcal.py

Matrix input and operator test
a,b,c[Enter](Matrixrow1)
d,e,f[Enter]....(Matrix row 2...)
to finish matrix,[Enter] or operator '*','+','-'
ex.for [a,b]   [x]   [ 12]
       [c,d] * [y] + [-34]
a,b[Enter]
c,d[Enter]
*[Enter]
x[Enter]
y[Enter]
+
12[Enter]
-34[Enter]
[Enter]

Section d'entrée à partir d'ici $ \ left (\ begin {array} {ccc} a & b \\ c & d \ end {array} \ right) \ left (\ begin {array} {ccc} x \\ y \ end { array} \ right) + \ left (\ begin {array} {ccc} 12 \\ -34 \ end {array} \ right) Mettez $ et $ \ left (\ begin {array} {ccc} (a) J'obtiens * x + b * y) + 12 \\ (c * x + d * y) + (-34) \ end {array} \ right) $.

input Matrix data.
>a,b
>c,d
>*
[ a  b ]
[ c  d ]
>x
>y
>+
[ a*x+b*y ]
[ c*x+d*y ]
>12
>-34
>
[ (a*x+b*y)+12 ]
[ (c*x+d*y)+(-34) ]

La matrice constante * est également OK.

input Matrix data.
>mag
>*
[ mag ]
>a,b
>c,d
>
[ mag*a  mag*b ]
[ mag*c  mag*d ]
matrixmul_str.py Saisissez l'expression de matrice sous forme de chaîne de caractères de format simplifié et affichez le résultat du calcul sous forme d'expression

matcal.py


#!/usr/bin/env python3
#Calculer le produit de la matrice comme chaîne de caractères de l'expression
import sys
import copy


def str_brackets(s):
    if ((s.find("+")>=0) or (s.find("-")>=0)) and (s.find("(")!=0) :
        # +/-Si tel est le cas, mettez-le entre parenthèses. S'il y a déjà des parenthèses, ne le mettez pas.
        return "("+s+")"
    else:
        return s

def str_mul(x,y):
    #Le résultat de la multiplication des expressions X et y dans la chaîne
    #Chaîne de caractères vide si l'un ou l'autre vaut 0
    #Si l'un vaut 1, l'autre est retourné tel quel
    #À moins qu'il ne soit nul, ce sera la connexion de la section suivante."+"Ajouter
    #Prémisse que les espaces avant et arrière ont été supprimés
    if x=="0" or y=="0":
        return ""
    elif x=="1":
        return str_brackets(y)+"+"
    elif y=="1":
        return str_brackets(x)+"+"
    else:
        return str_brackets(x)+"*"+str_brackets(y)+"+"

def matrix_add(A,B,op):
    Acol=len(A[0])
    Arow=len(A)
    Bcol=len(B[0])
    Brow=len(B)
    C=copy.deepcopy(A)
    if Acol!=Bcol or Arow!=Brow:
        print("Matrix add/sub matching error")
        sys.exit()
    for r in range(0,Arow):
        for c in range(0,Acol):
            x= A[r][c]
            y= B[r][c]
            if x=="0":
                C[r][c] = y
            elif y=="0":
                C[r][c] = x
            else:
                C[r][c] = str_brackets(A[r][c]) + op + str_brackets(B[r][c])
    return C

def sca_matrix_mul(k,M):
    #Produit de scalaire et de matrice
    R = copy.deepcopy(M)
    if k=="0":
        for r in range(0,len(M)):
            for c in range(0,len(M[0])):
                R[r][c]="0"
    elif k!="1": 
        for r in range(0,len(M)):
            for c in range(0,len(M[0])):
                R[r][c]=k+"*"+str_brackets(M[r][c])
    # k=="1"Puis retournez R tel quel
    return R

    
    
    
def matrix_mul(A,B):
    Acol=len(A[0])
    Arow=len(A)
    Bcol=len(B[0])
    Brow=len(B)
    if Acol==1 and Arow==1:
        R = sca_matrix_mul(A[0][0],B)
    elif Bcol==1 and Brow==1:
        R = sca_matrix_mul(B[0][0],A)
    elif Acol!=Brow:
        print("Matrix mul. matching error")
        sys.exit()
    else:
        R=[]
        for r in range(0,Arow):
            Rrow=[]
            for c in range(0,Bcol):
                s=""
                for i in range(0,Acol):
                    s += str_mul(A[r][i],B[i][c])
                    
                if len(s)==0:
                    Rrow.append("0")
                else:
                    Rrow.append(s[:-1])
            R.append(Rrow)
    return R

def matrix_print(A):
    for r in range(0,len(A)):
        s="["
        for c in range(0,len(A[0])):
            s += " {} ".format(A[r][c])
        s += "]"
        print(s)

def matrix_make(s):    
    # s="a11,a12,a13..// a21,a22,a23...// .... an1,an2,an3...ann" style
    # ex: "a11,a12,a13//a21,a22,a23//a31,a32,a33"
    # [a11,a12,a13]
    # [a21,a22,a23]
    # [a31,a32,a33]
    Srow=s.split("//")
    M=[]
    for r in range(0,len(Srow)):
        Scol=[x.strip() for x in Srow[r].split(",")]
        M.append(Scol)
    cnum_pre=len(M[0])
    for r in range(1,len(M)):
        cnum = len(M[r])
        if cnum!=cnum_pre:
            print("The number of columns is not uniform error")
            sys.exit()
    return M

def matrix_str_stdin():
    s=""
    operator=""
    while True:
        print(">",end='')
        s_inp=input()
        if s_inp=="+" or s_inp=="-" or s_inp=="*":
            s=s[2:]
            operator=s_inp
            break
        elif len(s_inp)==0 or s_inp=="=":
            s=s[2:]
            break
        else:
            s += "//{}".format(s_inp)
    return matrix_make(s),operator




print ("\nMatrix input and operator test")
print ("a,b,c[Enter](Matrixrow1)")
print ("d,e,f[Enter]....(Matrix row 2...)")
print ("to finish matrix,[Enter] or operator '*','+','-'")
print ("ex.for [a,b]   [x]   [ 12]")
print ("       [c,d] * [y] + [-34]")
print ("a,b[Enter]")
print ("c,d[Enter]")
print ("*[Enter]")
print ("x[Enter]")
print ("y[Enter]")
print ("+")
print ("12[Enter]")
print ("-34[Enter]")
print ("[Enter]")

print ("input Matrix data.")
(A,op2) = matrix_str_stdin()
while True:
    matrix_print(A)
    op=op2
    if op=="*":
        (B,op2) = matrix_str_stdin()
        A = matrix_mul(A,B)
    elif op=="+" or op=="-":
        (B,op2) = matrix_str_stdin()
        A = matrix_add(A,B,op)
    else:
        break

Recommended Posts