numpy 函数np.dot将GF4字段矩阵相乘很长时间

6xfqseft  于 2022-12-04  发布在  其他
关注(0)|答案(2)|浏览(107)

很长时间的大矩阵相乘,这个问题怎么解决,我用的是伽罗瓦库,还有numpy,我想应该还能稳定工作,我试着用numpy实现我的GF4算法和矩阵相乘,但是时间更长,谢谢回复。
当r = 2,3,4,5,6的时候,乘得快,那就需要很长的时间,对我来说,这些都不是很大的矩阵,这只是一个代码片段,我得到了给定r的某个族的矩阵的大小n,k,然后我需要把这些得到的参数的矩阵相乘。

import numpy as np
import galois

def family_Hamming(q,r):
    n = int((q**r-1)/(q-1))
    k = int((q**r-1)/(q-1)-r)
    res = (n,k)
    return res

q = 4
r = 7

n,k = family_Hamming(q,r)

GF = galois.GF(2**2)

#(5461,5461)
a = GF(np.random.randint(4, size=(k, k)))
#(5454,5461)
b = GF(np.random.randint(4, size=(k, n)))
c = np.dot(a,b)
print(c)
owfi6suc

owfi6suc1#

我不确定它是否真的更快,但是np.dot应该用于两个向量的点积,对于矩阵乘法,使用A @ B

3qpi33ja

3qpi33ja2#

尝试在CUDA运行时上使用jax,比如可以在Google Colab的免费GPU上试用(打开笔记本-〉运行时-〉更改运行时类型-〉GPU)。

import jax.numpy as jnp
from jax import device_put

a = GF(np.random.randint(4, size=(k, k)))
b = GF(np.random.randint(4, size=(k, n)))

a, b = device_put(a), device_put(b)
c = jnp.dot(a, b)

c = np.asarray(c)

定时试验:

%timeit jnp.dot(a, b).block_until_ready()
# 765 ms ± 96.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

相关问题