Matrix 如何有效地进行矩阵乘法
我有一个大矩阵M(M是正定的),维数为(1000010000),我想做以下操作:Matrix 如何有效地进行矩阵乘法,matrix,matrix-multiplication,scientific-computing,computation,Matrix,Matrix Multiplication,Scientific Computing,Computation,我有一个大矩阵M(M是正定的),维数为(1000010000),我想做以下操作: r = transpose(e_i - e_j) * M * (e_i - e_j) where e_i is zeros vector(10000 x 1) with all zero entries except at ith entry 我想为(e_1,e_2)…(e_1,e_10000)…执行此操作。。。i、 e所有i,j对都属于{110000} 我试过了 -do the calculation dir
r = transpose(e_i - e_j) * M * (e_i - e_j)
where e_i is zeros vector(10000 x 1) with all zero entries except at ith entry
我想为(e_1,e_2)…(e_1,e_10000)…执行此操作。。。i、 e所有i,j对都属于{110000}
我试过了
-do the calculation directly
-Cholesky factorization
然而,这两种方法都需要很长时间。他们花了>=0.5秒完成了一次计算,因此在时间上不可行
是否有任何方法/库可以尝试加速此过程?您应该了解它是为O(n^2.8)中的大型矩阵相乘而设计的。示例实现您的表达式是
转置(e_i-e_j)*M*(e_i-e_j)
。让我们取最后一部分,即M*(e_i-e_j)
,然后将其相乘得到M*e_i-M*e_j
现在由于e_i
是零,除了i
th元素M*e_i
只是选择M
的i
th列,我们不需要计算M[:,i]
。用ei
再次取点积,这就得到了M[i,i]
将您的表达完全放大,并将此想法应用于所有4个术语,即可得到@dmuir在上述评论中给出的答案:
r = M[i,i] - M[j,i] - M[i,j] + M[j,j]
这个表达式应该非常快,并且(原则上)完全不依赖于矩阵的大小。所以你实际上根本不需要任何矩阵运算来计算你想要的
既然你说你想对所有i,j对都这样做,那么你可能想得到一个矩阵R
,这样R[i,j]
就像上面给出的R
一样。你可以在i,j
上做一个循环,或者你可以用类似
d = np.array([np.diag(a)])
R = d + d.T - M - M.T
对于你说的尺寸,我预计整个操作将在1秒左右完成
考虑到矩阵的大小,我可能会尽量避免使用临时变量
d = np.array([np.diag(a)])
R = d + d.T
R -= M
R -= M.T
r=M[i,i]-M[j,i]-M[i,j]+M[j,j]的可能副本