我是一位研究地球物理反演的研究員。這可能需要解決線性系統:Au = rhs。這裏A通常是稀疏矩陣,但rhs和u可以是密集矩陣或向量。爲了進行基於梯度的反演,我們需要靈敏度計算,它需要一些矩陣矩陣和矩陣向量的乘法。最近我發現在矩陣(稀疏)一個奇怪的行爲 - 矩陣(密集)乘,下面是一個例子:矩陣(scipy稀疏) - 矩陣(密集; numpy陣列)乘法效率
import numpy as np
import scipy.sparse as sp
n = int(1e6)
m = int(100)
e = np.ones(n)
A = sp.spdiags(np.vstack((e, e, e)), np.array([-1, 0, 1]), n, n)
A = A.tocsr()
u = np.random.randn(n,m)
%timeit rhs = A*u[:,0]
#10 loops, best of 3: 22 ms per loop
%timeit rhs = A*u[:,:10]
#10 loops, best of 3: 98.4 ms per loop
%timeit rhs = A*u
#1 loop, best of 3: 570 ms per loop
我在compution時間預計幾乎直線上升,當我越來越密集矩陣的大小u
乘以稀疏矩陣A
(例如,第二個A*u[:,:10]
假設爲220ms,最後一個A*u[:,:10]
2.2s)。但是,它比我預期的要快得多。相反,矩陣向量乘法比矩陣乘法要慢得多。有人能解釋爲什麼嗎?此外,是否有一種有效的方法來提高Matrix-vector乘法的效率與Matrix-Matrix乘法相似?
您必須深入研究這些乘法的函數調用堆棧。這不是一項簡單的任務。很明顯,它不僅僅是迭代'u'列並收集值。這是一個稀疏密集密集的情況,與稀疏稀疏或密集密集不同。 – hpaulj