【发布时间】:2021-04-24 09:58:00
【问题描述】:
我有两个稠密矩阵A 和B,每个矩阵都有3e5x100 的大小。另一个稀疏二进制矩阵C,大小为3e5x3e5。我想找到以下数量:C ∘ (AB'),其中∘ 是 Hadamard 产品(即元素方面),B' 是 B 的转置。显式计算AB' 将要求大量内存(~500GB)。由于最终结果不需要整个AB',因此只计算乘法A_iB_j' 就足够了,其中C_ij != 0,其中A_i 是矩阵i 的列A 和C_ij 是矩阵C 的位置(i,j) 处的元素。建议的方法类似于以下算法:
result = numpy.initalize_sparse_matrix(shape = C.shape)
while True:
(i,j) = C_ij.pop_nonzero_index() #prototype function returns the nonzero index and then points to the next nonzero index
if (i,j) is empty:
break
result(i,j) = A_iB_j'
然而,这个算法需要太多时间。无论如何使用LAPACK/BLAS 算法来改进它?我正在用 Python 编码,所以我认为 numpy 可以成为 LAPACK/BLAS 的更人性化的包装器。
【问题讨论】:
-
你的 C 有多稀疏?获取 C 中 1 的所有坐标需要多长时间?我不记得有任何算法可以减少这种计算
标签: python numpy matrix sparse-matrix lapack