遍历Sympy矩阵并对其进行操作

时间:2019-04-27 10:19:57

标签: matrix sympy matrix-multiplication

我对here的修改后的代码块通过使用Sympy库的函数(XOR和AND)(下面的第一个代码块)对python列表进行XOR处理。但是,我对如何通过sympy矩阵(下面的第二个代码块)进行迭代感到困惑。

python列出的有效代码是:

from sympy import And, Xor
from sympy.logic import SOPform, simplify_logic
from sympy import symbols
def LogMatrixMult (A, B):
    rows_A = len(A)
    cols_A = len(A[0])
    rows_B = len(B)
    cols_B = len(B[0])

    if cols_A != rows_B:
      print ("Cannot multiply the two matrices. Incorrect dimensions.")
      return

    # Create the result matrix
    # Dimensions would be rows_A x cols_B
    C = [[0 for row in range(cols_B)] for col in range(rows_A)]
    for i in range(rows_A):
        for j in range(cols_B):
            for k in range(cols_A):
                # I can add Sympy's in simplify_logic(-)
                C[i][j] = Xor(C[i][j], And(A[i][k], B[k][j]))
    return C
b, c, d, e, f, w, x, y, z = symbols('b c d e f w x y z')
m1 = [[b,c,d,e]]
m2 = [[w,x],[x,z],[y,z],[z,w]]

result = simplify_logic(LogMatrixMult(m1, m2)[0][0])
print(result)

在下面使用Sympy矩阵的代码块中,请注意i,j,k和C,A,B定义是我尝试修改以使用迭代器的,我不知道这是否需要或正确。

from sympy import And, Xor
from sympy.matrices import Matrix
from sympy.logic import SOPform, simplify_logic
from sympy import symbols, IndexedBase, Idx
from sympy import symbols

def LogMatrixMultArr (A, B):
    rows_A = A.rows
    cols_A = A.cols
    rows_B = B.rows
    cols_B = B.cols
    i,j,k = symbols('i j k', cls=Idx)
    C = IndexedBase('C')
    A = IndexedBase('A')
    B = IndexedBase('B')

    if cols_A != rows_B:
      print ("Cannot multiply the two matrices. Incorrect dimensions.")
      return

    # Create the result matrix
    # Dimensions would be rows_A x cols_B
    C = [[0 for row in range(cols_B)] for col in range(rows_A)]
    for i in range(rows_A):
        for j in range(cols_B):
            for k in range(cols_A):
                # I can add Sympy's in simplify_logic(-)
                C[i,j] = Xor(C[i,j], And(A[i,k], B[k,j]))
                # C[i][j] = Xor(C[i][j],And(A[i][k],B[k][j]))
    return C
b, c, d, e, f, w, x, y, z = symbols('b c d e f w x y z')
P = Matrix([w,x]).reshape(1,2)
Q = Matrix([y,z])
print(LogMatrixMultArr(P,Q))

我得到的错误是:TypeError:列表索引必须是整数或切片,而不是元组

C[i,j] = Xor(C[i,j], And(A[i,k], B[k,j]))

现在,我相信我必须以某种特殊的方式来进行sympy的迭代,但是如果我确实需要这种方法,那么我将停留在如何使其在代码中工作的问题上。

此外,如果有人知道如何使用XOR和And(非按位)而不是+和*运算符以更快的方式执行上述操作,请共享。

谢谢。

1 个答案:

答案 0 :(得分:0)

我认为问题出在IndexedBase对象上。我没有能力胜任这些工作,但您似乎没有正确使用它们。如果您替换

    i,j,k = symbols('i j k', cls=Idx)
    C = IndexedBase('C')
    A = IndexedBase('A')
    B = IndexedBase('B')

通过

    C = zeros(rows_A, cols_B)

并删除C = [[0 for row in range(cols_B)] for col in range(rows_A)],然后它可以工作。