簡體   English   中英

乘以存儲為列表的稀疏矩陣 C++ 首選

[英]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]
            ]

算法是這樣工作的,

  1. 遍歷A的行,如果該行為空,則跳過
  2. 對於該列,(0, 1) = 1,因此檢查 B 的第 1 行是否為空,如果不是,則遍歷它(這是 1 唯一與之交互的東西)
  3. 對於 B 的 ai(k) 行列中的每個節點(在本例中為 1),將節點的值乘以 A 中節點的值,並將其添加到結果矩陣中 -> 在我們的例子中是 ( 0, 1) * (1, 3) = 1 * 2 = 2,所以將 2 添加到 (0, 3) 處的結果矩陣

注意: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.

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