Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matrix 如何有效地进行矩阵乘法_Matrix_Matrix Multiplication_Scientific Computing_Computation - Fatal编程技术网

Matrix 如何有效地进行矩阵乘法

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

我有一个大矩阵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 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]的可能副本