[英]Multiply Sparse Matrices stored as lists C++ preferred
我目前已經實現了一個將兩個稀疏矩陣相乘的基本算法。
在我的實現中,稀疏矩陣有一個主干行,然后是一個附有列的節點列表。
我目前 go 通過新矩陣的行和列,並遞增 k 以使所有行和列相乘。
然后我做了一個輕微的優化,只訪問矩陣 A (A*B = C) 中行的矩陣的非零元素。
但目前最大的減速是必須在 B.ie 中獲得正確的列。 A(i, k) * B(k, j)。 B(k, j) 非常昂貴,因為您必須每次都進行迭代,直到獲得匹配的第 j 列。
這行得通,但我想知道我是否可以讓它更快。
謝謝。
PS:到目前為止我看到的大多數帖子都集中在具體實現上,我更喜歡算法,c++ 代碼是一個獎勵。
我還嘗試通過遍歷矩陣 B 提前保存空列,但我不確定這是否會顯着加快速度。
我認為有一個很好的算法可以使用它迭代的每個元素。 我會說你的算法是 O(n^3) mult * ~n 每次訪問每個第 j 個成員,所以大致是 O(n^4)。
該算法 < O(n^3)。
A = [
[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 2, 0, 4],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]
]
B = [
[0, 0, 0, 0, 3],
[0, 0, 0, 2, 0],
[0, 0, 3, 0, 0],
[0, 0, 3, 0, 0],
[0, 0, 0, 0, 0]
]
算法是這樣工作的,
注意:m 行、n 列和 k(行-列匹配)中的每一行都形成 n^3,但在稀疏矩陣中,由於密度低,您需要迭代的次數要少得多。
我們可以跳過 0 行減少 m,我們可以跳過“0”行值減少 k,我們可以跳過一些 0 列使 k 再次變小。 在此算法中沒有減少 n 的真正方法。
最后,我們的 O(m n k) 即 O(n^3) 的系數要小得多,比如 O(1/100 * m n k),因為您使用的這些元素更少。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.