Я должен реализовать в 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
Однако, похоже, это работает, только если матрица диагональна, и если элементы на диагонали четны.В этот момент я совершенно растерялся, но у меня такое чувство, что эта проблема уже давно решена.
Ура, Риккардо