稀疏矩陣相乘-Python版


                                      稀疏矩陣相乘-Python版

Given two sparse matrices A and B, return the result of AB.

You may assume that A's column number is equal to B's row number.

Example:


    
    
   
  
  
          
  1. A = [
  2. [ 1, 0, 0],
  3. [-1, 0, 3]
  4. ]
  5. B = [
  6. [ 7, 0, 0 ],
  7. [ 0, 0, 0 ],
  8. [ 0, 0, 1 ]
  9. ]
  10. | 1 0 0 | | 7 0 0 | | 7 0 0 |
  11. AB = | -1 0 3 | x | 0 0 0 | = | -7 0 3 |
  12. | 0 0 1 |

使用傳統的矩陣相乘的算法肯定會處理大量的0乘0的無用功,所以我們適當的優化算法,我們知道一個 i x k 的矩陣A乘以一個 k x j 的矩陣B會得到一個 i x j 大小的矩陣C,那么我們來看結果矩陣中的某個元素C[i][j]是怎么來的,起始是A[i][0]*B[0][j] + A[i][1]*B[1][j] + ... + A[i][k]*B[k][j],那么為了不重復計算0乘0,我們首先遍歷A數組,要確保A[i][k]不為0,才繼續計算,然后我們遍歷B矩陣的第k行,如果B[K][J]不為0,我們累加結果矩陣res[i][j] += A[i][k] * B[k][j]; 這樣我們就能高效的算出稀疏矩陣的乘法,參見代碼如下:


    
    
   
  
  
          
  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Sun Sep 02 15:10:34 2018
  4. @author: Administrator
  5. """
  6. def SparseMatrixMultiply(A, B): #減少計算次數
  7. res = [[ 0 for i in range(len(B[ 0]))] for j in range(len(A))]
  8. for i in range(len(A)):
  9. for j in range(len(A[ 0])):
  10. if A[i][j] != 0: #non-zero
  11. for k in range(len(B[ 0])):
  12. if B[j][k] != 0: #non-zero
  13. res[i][k] += A[i][j] * B[j][k]
  14. return res
  15. if __name__ == '__main__':
  16. A = [[ 1, 0, 0],[ -1, 0, 3]]
  17. B = [[ 7, 0, 0],[ 0, 0, 0],[ 0, 0, 1]]
  18. result = SparseMatrixMultiply(A, B)
  19. print(result)

三元組方法

typedef struct NODE{ //定義稀疏矩陣結點       
 int i;       //行
 int j;       //列
 int data;   //值
} Node;
typedef struct MATRIX{ //定義稀疏矩陣(可以快速訪問)       
 int mu, nu, tu;      // mu為矩陣行數,nu為矩陣列數,tu為矩陣中非零元素的個數
 Node matrix[MAXSIZE+1];       
 int rpos[MAXR+1];
} Matrix; 

算法時間復雜度為:O(A->tu*B->tu/B->mu)

此外還有十字鏈表法。

Python科學計算包scipy

import scipy as sp

a = sp.sparse.linalg.norm(S, 'fro')


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM