稀疏矩陣相乘 Python版

2022-09-04 00:27:10 字數 1747 閱讀 8751

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...