迭代和操作 Sympy 矩阵
Iterating through and operating on Sympy Matrices
我从 here 修改的代码块通过使用 Sympy 库的函数(XOR 和 AND)(下面的第一个代码块)用于 XOR'ing python 列表。但是,我对如何通过 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))
我得到的错误是:类型错误:列表索引必须是整数或切片,而不是元组
C[i,j] = Xor(C[i,j], And(A[i,k], B[k,j]))
现在我相信我必须用一些特殊的 sympy 迭代方式来做一些事情,但我仍然坚持如何让它在代码中工作——如果我确实需要这种方法的话。
此外,如果有人知道如何使用 XOR 和 And(非按位)而不是 + 和 * 运算符更快地完成上述操作,请分享。
谢谢。
我认为问题出在 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)]
,然后就可以了。
我从 here 修改的代码块通过使用 Sympy 库的函数(XOR 和 AND)(下面的第一个代码块)用于 XOR'ing python 列表。但是,我对如何通过 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))
我得到的错误是:类型错误:列表索引必须是整数或切片,而不是元组
C[i,j] = Xor(C[i,j], And(A[i,k], B[k,j]))
现在我相信我必须用一些特殊的 sympy 迭代方式来做一些事情,但我仍然坚持如何让它在代码中工作——如果我确实需要这种方法的话。
此外,如果有人知道如何使用 XOR 和 And(非按位)而不是 + 和 * 运算符更快地完成上述操作,请分享。
谢谢。
我认为问题出在 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)]
,然后就可以了。