簡體   English   中英

快速稀疏矩陣乘法

[英]Fast sparse matrix multiplication

對於類,我必須為稀疏矩陣編寫自己的線性方程求解器。 我可以自由地為稀疏矩陣使用任何類型的數據結構,我必須實現幾個解,包括共軛漸變。

我想知道是否有一種着名的方法來存儲稀疏矩陣,使得與向量的乘法相對較快。

現在我的稀疏矩陣基本上實現了一個包裝的std::map< std::pair<int, int>, double> ,它存儲數據(如果有的話)。 這將矩陣與向量的乘法轉換為O(n²)復雜度到O(n²log(n)),因為我必須對每個矩陣元素進行查找。 我查看了耶魯稀疏矩陣格式,似乎元素的檢索也在O(log(n))中,所以我不確定它是否會更快。

作為參考,我有一個800x800矩陣,填充了5000個條目。 使用共軛梯度法大約需要450秒來解決這樣的系統。

您認為使用其他數據結構可以更快地完成嗎?

謝謝!

最常見的選擇是CSC或CSR存儲 這些對於矩陣向量乘法都是有效的。 如果你必須自己編寫,那么編寫這些乘法例程也很容易。

也就是說,耶魯存儲也產生非常有效的矩陣向量乘法。 如果您正在執行矩陣元素查找,那么您誤解了如何使用該格式。 我建議你研究一些標准的稀疏庫來學習如何實現矩陣向量乘法。

即使使用當前存儲,您也可以執行O(n)復雜度的矩陣乘法。 我見過的所有稀疏矩陣向量乘法算法歸結為相同的步驟。 例如,考慮y = Ax。

  1. 將結果向量歸零,y。
  2. 初始化矩陣的非零元素的迭代器,A。
  3. 得到矩陣的下一個非零元素,A [i,j]說。 請注意,i,j的模式不遵循常規模式。 它只是反映了存儲A的非零元素的順序。
  4. y [i] + = A [i,j] * x [j]
  5. 如果有更多A元素,請轉到3。

我懷疑你正在編寫經典的雙循環密集乘法代碼:

for (i=0; i<N; i++)
    for (j=0; j<N; j++)
        y[i] += A[i,j]*x[j]

這就是導致你執行查找的原因。

但我並不是說你堅持使用std::map存儲。 這不會超級高效。 我推薦CSC主要是因為它是使用最廣泛的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM