我必须在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
但是,这似乎仅在矩阵为对角线且对角线上的元素为偶数时才有效。在这一点上我很迷失,但是我觉得这个问题早就已经解决了。
干杯, 里卡多