Итерация и работа с матрицами Симпи - PullRequest
0 голосов
/ 27 апреля 2019

Мой модифицированный блок кода из здесь работает для списков 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 (не побитовых) вместо операторов + и * более быстрым способом, пожалуйста, поделитесь.

Спасибо.

1 Ответ

0 голосов
/ 28 апреля 2019

Я думаю, что проблема с объектами 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)], тогда все заработает.

...