[PYTHON] Berechnen Sie das Produkt von Matrizen mit einem Zeichenausdruck?

Wenn Sie 3D-Rotation und Kalman-Filter studiert haben, um mit der IMU von M5StickC zu spielen Es scheint, dass Sie nicht aus der Warteschlange entkommen können, oder es ist einfacher, die Warteschlange zu verwenden, es riecht so. Ich habe sogar den Stapel von Zeilen gegoogelt, der mir nicht in Erinnerung geblieben ist ... Es ist mühsam, mit der Formel herumzuspielen, um keinen Fehler zu machen. Deshalb habe ich versucht, ein Programm zu erstellen, das das Produkt der Matrixformel ausgibt, die die Formel so enthält, wie sie ist, auch als Studie über Python (lacht).

Nachtrag: Ich habe auch versucht, Operatoren (* (einschließlich Skalarzeiten), +, -) zu unterstützen. Die feste Berechnung wird wie ein Taschenrechner angezeigt Nur das Produkt, das Produkt mit dem Skalar und die Summe / Differenz, aber ich habe es zuerst versucht. Anhang 2: Es ist schwierig, unnötige Begriffe in einer mit 0 und 1 gemischten Matrix zu finden und zu entfernen. Deshalb habe ich versucht, so viel wie möglich zu entfernen und bereitzustellen.

##########\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]

Eingabeabschnitt von hier $ \ left (\ begin {array} {ccc} a & b \\ c & d \ end {array} \ right) \ left (\ begin {array} {ccc} x \\ y \ end { Array} \ rechts) + \ links (\ begin {array} {ccc} 12 \\ -34 \ end {array} \ right) Setzen Sie $ und $ \ left (\ begin {array} {ccc} (a) * 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) ]

Die Konstanten * -Matrix ist ebenfalls in Ordnung.

input Matrix data.
>mag
>*
[ mag ]
>a,b
>c,d
>
[ mag*a  mag*b ]
[ mag*c  mag*d ]
matrixmul_str.py Geben Sie den Matrixausdruck als Zeichenfolge im vereinfachten Format ein und zeigen Sie das Berechnungsergebnis als Ausdruck an

matcal.py


#!/usr/bin/env python3
#Berechnen Sie das Produkt der Matrix als Zeichenfolge des Ausdrucks
import sys
import copy


def str_brackets(s):
    if ((s.find("+")>=0) or (s.find("-")>=0)) and (s.find("(")!=0) :
        # +/-Wenn dies der Fall ist, schließen Sie es in Klammern ein. Wenn es bereits Klammern gibt, schließen Sie es nicht ein.
        return "("+s+")"
    else:
        return s

def str_mul(x,y):
    #Das Ergebnis der Multiplikation der Ausdrücke X und y in der Zeichenfolge
    #Leere Zeichenfolge, wenn eine der beiden 0 ist
    #Wenn einer 1 ist, wird der andere so zurückgegeben, wie er ist
    #Wenn es nicht Null ist, wird es die Verbindung des nächsten Abschnitts sein."+"Hinzufügen
    #Angenommen, die vorderen und hinteren Leerzeichen wurden gelöscht
    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):
    #Produkt aus Skalar und Matrix
    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"Geben Sie dann R so zurück, wie es ist
    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