Мой модифицированный блок кода из здесь работает для списков Python XOR, используя функции (XOR и AND) библиотеки 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))
Ошибка, которую я получаюis: TypeError: списочные индексы должны быть целыми или кусочками, а не кортежем
C[i,j] = Xor(C[i,j], And(A[i,k], B[k,j]))
Теперь я считаю, что мне нужно что-то сделать с каким-то особым способом итерации sympy, но я застрял в том, как заставить его работать вкод - если мне даже нужна эта методология.
Кроме того, если кто-нибудь знает, как сделать что-то подобное, как указано выше, с использованием XOR и And (не побитовых) вместо операторов + и * более быстрым способом, пожалуйста, поделитесь.
Спасибо.