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