Матрично-векторное умножение от десятичного до двоичного - PullRequest
0 голосов
/ 01 марта 2019

Я должен реализовать в python3.6 умножение матрицы на вектор в системе, которая может обрабатывать только объекты с двоичными состояниями (в следующих 0 или 1).Мне просто нужно сделать: y = Rx, где R - это квадратная матрица NxN (в общем, несимметричная), а x - это вектор с N элементами.

То, как я подхожу к проблемечтобы преобразовать вектор x в кортеж целых чисел без знака.Используя numpy uint8, он становится вектором из 8N элементов, например:

e_1 = (1,0,0,...,0)
e_2 = (0,1,0,...,0)
...
e_N = (0,0,0....,1)

Моя проблема заключается в том, как преобразовать матрицу R в двоичное представление, так что я все еще могу выполнить умножение матрицы для получениядвоичное представление y, которое я позже могу преобразовать в десятичное.

Например:

x = [10, 25, 20]
R = [[2, 1, 0],
     [1, 4, 0],
     [0, 0, 2]]

x_b = np.unpackbits(x)  # (4)*8 = (24)
R_b = some_function(R)

# calculation in decimal representation
y = np.dot(R, x)

# calculation in binary representation
y_b = np.dot(R_b, x_b)
z = np.packbits( y_b )

Если процедура имеет смысл, y и z должны быть одинаковыми.Теперь я напомню из линейной алгебры, что упомянутые выше двоичные векторы имеют такую ​​же структуру стандартного базиса векторного пространства.Итак, я подумал, что, неоднократно применяя R к каждому из этих векторов, я смогу создать двоичное представление R.Моя реализация some_function:

def some_function(R, n_bits=8):
  n_cols = R.shape[0]
  n_vectors = n_cols*n_bits
  R_b = np.zeros([n_vectors, n_vectors], dtype='uint8')
  for i in range(n_vectors):
     v_bin = np.zeros(n_vectors, dtype='uint8')
     v_bin[i] = 1

     v_dec = np.packbits(v_bin)

     u_dec = np.dot(R, v_dec)
     u_bin = np.unpackbits(u_dec)

     R_b[:, i] = u_bin

  return R_b

Однако, похоже, это работает, только если матрица диагональна, и если элементы на диагонали четны.В этот момент я совершенно растерялся, но у меня такое чувство, что эта проблема уже давно решена.

Ура, Риккардо

...