given two sparse matricesaandb, return the result ofab.
you may assume thata's column number is equal tob's row number.
example:
a = [
[ 1, 0, 0],
[-1, 0, 3]
]b = [
[ 7, 0, 0 ],
[ 0, 0, 0 ],
[ 0, 0, 1 ]
]| 1 0 0 | | 7 0 0 | | 7 0 0 |
ab = | -1 0 3 | x | 0 0 0 | = | -7 0 3 |
| 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]; 這樣我們就能高效的算出稀疏矩陣的乘法,參見**如下:
# -*- coding: utf-8 -*-
"""created on sun sep 02 15:10:34 2018
@author: administrator
"""def
sparsematrixmultiply
(a, b):
#減少計算次數
res = [[0
for i in range(len(b[0]))] for j in range(len(a))]
for i in range(len(a)):
for j in range(len(a[0])):
if a[i][j] != 0:#non-zero
for k in range(len(b[0])):
if b[j][k] != 0:#non-zero
res[i][k] += a[i][j] * b[j][k]
return res
if __name__ == '__main__':
a = [[1,0,0],[-1,0,3]]
b = [[7,0,0],[0,0,0],[0,0,1]]
result = sparsematrixmultiply(a, b)
print(result)
typedef struct node node;
typedef struct matrix matrix;
演算法時間複雜度為:o(a->tu*b->tu/b->mu)
此外還有十字鍊錶法。
python科學計算包scipy
import scipy as sp
a = sp.sparse.linalg.norm(s, 'fro')
稀疏矩陣相乘mmult
資料結構基礎 c語言版 第2版,ellis horowitz著,朱仲濤譯 1.3節,page64,程式2.10 稀疏矩陣相乘 如下 include using namespace std struct term term a 100 b 100 插入元素到積矩陣 void storesum term...
實現稀疏矩陣相乘C C
1 問題描述 已知稀疏矩陣a m1,n1 和b m2,n2 求乘積c m1,n2 a 3 0 0 7 b 4 1 c 12 17 0 0 0 1 0 0 0 2 0 2 0 0 1 1 0 0 0 2 a b c的三元組表示法分別為 a ijv1112 2147 324 1 4322 b i jv1...
輸出稀疏矩陣並相乘
一 問題描述 以三元組形式儲存稀疏矩陣,實現矩陣相乘。二 問題分析 當乙個階數較大的矩陣中的非零元素個數s相對於矩陣元素的總個數t非常小時,即s 三 實現 1 標頭檔案 ifndef my bitree h define my bitree h include include 函式結果狀態碼 def...