實現稀疏矩陣相乘C C

2021-07-23 17:23:32 字數 2257 閱讀 1903

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

jv11

1421

2133

1143

2-154

22 c

ijv11112

21217

322-2

2、解決思路:由矩陣乘法規則可知c(i,j) = a(i,1)*b(1,j)+a(i,2)*b(2,j)+....+a(i,n)*b(n,j),即c(i,j)為a的第i行與b的第j列非零元素乘積之和。設定累加器temp[b的列值]儲存c矩陣每行的值,結束後將temp中的值賦給c矩陣。

3、定義資料結構:

3.1、稀疏矩陣中節點的定義:

//定義三元組表的節點

typedef structspnode;

i,j為行列值,v為此位置的數值。

3.2、稀疏矩陣的定義:

//定義三元組表

typedef structspmatrix;

mu為矩陣行數,nu為矩陣列數,tu為矩陣中非零元素的個數。

4、具體實現:

為了便於b.data尋找第k行第乙個非零元素,在此引入num和rpot兩個內容。num[k]表示矩陣b中第k行非零元素的個數;rpot[k]表示第k行的第乙個非零元素在b.data中的位置。

rpot[1] = 0;

rpot[k] = rpot[k-1]+num[k-1];

矩陣b中的num與rpot的值

col12

34num[col]20

20rpot[col]02

244.1、初始化。清理一些單元,準備按行順序存放乘積矩陣。

4.2、求b的num與rpot。

4.3、做矩陣的乘法。

5、**的具體實現:

/*

*進行兩個稀疏矩陣之間的乘法

*/#include#include#define smax 1024

//定義三元組表的節點

typedef structspnode;

//定義三元組表

typedef structspmatrix;

//進行兩個稀疏矩陣之間的乘法,返回值為乘積矩陣

spmatrix * mulsmatrix(spmatrix *a,spmatrix *b)

//a的列值與b的行值不相等時

if(a->nu!=b->mu) return null;

c->mu = a->mu;

c->nu = b->nu;

//當a或b中的非零元素為0時

if(a->tu*b->tu==0)

//計算b矩陣中每行非0元素的個數

for(i = 1;i<=b->mu;i++)

num[i] = 0;

for(i = 0;itu;i++)

num[b->data[i].i]++;

rpot[1] = 0;

//計算b矩陣中每行首位非0元素的位置

for(i = 2;i<=b->mu;i++)

rpot[i] = rpot[i-1]+num[i-1];

r = 0;//記錄當前c矩陣中非0元素的個數

p = 0;//指示當前a矩陣中非零元素的位置

//進行矩陣的乘積運算

for(i = 1;i<=a->mu;i++)

p++;

}//將第i行的結果賦值給c矩陣

for(j = 1;j<=b->nu;j++);

r++;}}

}c->tu = r;

return c;

}int main()

5、演算法的時間複雜度:

5.1、求num的時間複雜度為:o(2*b->nu)

5.2、求rpot的時間複雜度為:o(b->mu)

5.3、求temp的時間複雜度為:o(a->mu*b->nu)

5.4、求c中所有元素的時間複雜度為:o(a->tu*b->tu/b->mu)

稀疏矩陣相乘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 矩陣相乘

矩陣相乘最重要的方法是一般矩陣乘積。它只有在第乙個矩陣的列 column 和第二個矩陣的行數 row 相同時才有意義 一般單指矩陣乘積時,指的便是一般矩陣乘積。乙個m n的矩陣就是m n個數排成m行n列的乙個數陣。由於它把許多資料緊湊的集中到了一起,所以有時候可以簡便地表示一些複雜的模型。運算如下所...

輸出稀疏矩陣並相乘

一 問題描述 以三元組形式儲存稀疏矩陣,實現矩陣相乘。二 問題分析 當乙個階數較大的矩陣中的非零元素個數s相對於矩陣元素的總個數t非常小時,即s 三 實現 1 標頭檔案 ifndef my bitree h define my bitree h include include 函式結果狀態碼 def...