从十进制到二进制的矩阵向量乘法

时间:2019-03-01 18:49:54

标签: python numpy matrix-multiplication binary-data

我必须在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 )

如果该过程有意义,则yz应该相同。 现在,我从线性代数回忆起,上面提到的二进制向量具有向量空间标准基础的相同结构。因此,我认为通过对每个向量重复应用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

但是,这似乎仅在矩阵为对角线且对角线上的元素为偶数时才有效。在这一点上我很迷失,但是我觉得这个问题早就已经解决了。

干杯, 里卡多

0 个答案:

没有答案