當前位置:編程學習大全網 - 編程語言 - 稀疏矩陣乘法的算法思想

稀疏矩陣乘法的算法思想

/*乘法部分*/

//C = A * B

/*算法分析:

首先,因為樓主沒有給出輸入函數,也沒有給出三元組稀疏矩陣數據結構的完整解釋。

所以我只能猜測這個稀疏矩陣是按照行為主順序存儲的。(後面的乘法函數證實了我的猜測,

但如果很不幸我猜錯了,請樓主知道)

還有壹種猜測是,樓主的程序中,matrix和array的下標是從1開始設置的,而不是從0開始。

接下來說普通矩陣的乘法,線性代數裏有定義,不用多說。

我想說的是,稀疏矩陣的乘法也是用這個公式計算的,但是有壹個問題——效率。

讓我們舉壹個例子來說明:

假設我們知道A:m*n,B:n*l,我們要計算C:m*l,那麽C(i,j)的計算公式是:

C (I,J) = A (I,1) * B (1,J)+A (I,2) * B (2,J)+...+A (I,N) * B (N,J)公式65438+

如果A和B都是普通矩陣(並且存儲在二維數組中),可以直接用循環語句來完成。

如果A和B都是稀疏矩陣(而且是亂序存儲,也就是沒有按行序或者列序存儲),那麽計算起來會很麻煩。

我們需要先遍歷整個A矩陣,找出是否有A(i,1)(如果有,取其值,如果沒有,取其值為0),然後再去。

遍歷B矩陣找到B(1,j)並將它們相乘;然後是A(i,2)和B(2,j),以此類推。

這當然可行,但顯然效率太低。壹種改進的方法(即樓主程序中使用的方法)如下:

首先要優化稀疏矩陣的存儲,不是亂序,而是按行序或者列序。

例如,這裏我們以行順序為主順序,以列順序為順序。

具體來說,稀疏矩陣中第壹行的非零元素排列在前,然後是第二行和第三行...

每行的非零元素按列順序排列,使得存儲的稀疏矩陣有序。

接下來,在實際使用公式計算之前,我們需要做壹個預處理。

這個預處理是對矩陣B做的,其實就是計算矩陣B對應的pos數組..

那麽這個pos數組是什麽意思呢?

我們從代碼中很容易看出,pos數組的長度是矩陣B的行數(即B->;m)加1。

pos[I](1 & lt;= i & lt= B-& gt;m)表示三元數組B中矩陣B的第I行第壹個非零元素的位置。

pos[I](I = = B-& gt;M+1)是為了方便後期計算而加的壹個標記,類似於壹個監控崗。

有了這個pos數組,我們可以通過計算公式1來提高效率。

效率的提高表現在兩個方面:

1,我們看到雖然代碼中有兩層while循環(如下),但實際上始終只執行了壹個->循環。t次。

p = 1;

while(p & lt;= A-& gt;t)

{

……

while(p & lt;= A-& gt;t & amp& ampa-& gt;數據[p]。row==crow)

{

……

p = p+1;

}

……

}

2.在第二層while循環中的for循環中,由於pos數組的作用,循環次數大大減少。

for(q = pos[brow];q & lt= pos[brow+1]-1;q++)

{

ccol = B-& gt;數據[q]。col

ctemp[ccol]= ctemp[ccol]+A-& gt;數據[p]。v * B-& gt;數據[q]。五;

}

好了,這就是稀疏矩陣乘法的壹般過程。如有錯誤,請指正。

*/

void MultS(TriTable *A,TriTable *B,TriTable *C)

{

int k,p,q,brow,crow,ccol

int num[MAXSIZE],pos[MAXSIZE],ctemp[MAXSIZE];

如果(A-& gt;n = = B-& gt;m)

{

for(k = 1;k & lt= B-& gt;m;k++)

num[k]= 0;

for(k = 1;k & lt= B-& gt;t;k++)

num[B->;數據[k]。row]++;

pos[1]= 1;

for(k = 2;k & lt= B-& gt;m;K++) // K

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

pos[1+B->;m]= pos[B-& gt;m]+1;//K

c->;m = A-& gt;m;

c->;n = B-& gt;n;

c->;t = 0;

p = 1;

while(p & lt;= A-& gt;t)

{

烏鴉= A-& gt;數據[p]。排;

for(k = 1;k & lt= C->;n;k++)

ctemp[k]= 0;

while(p & lt;= A-& gt;t & amp& ampa-& gt;數據[p]。row==crow)

{

brow = A-& gt;數據[p]。col

for(q = pos[brow];q & lt= pos[brow+1]-1;q++)

{

ccol = B-& gt;數據[q]。col

ctemp[ccol]= ctemp[ccol]+A-& gt;數據[p]。v * B-& gt;數據[q]。五;

}

p = p+1;

}

for(ccol = 1;ccol & lt= B-& gt;n;ccol++)

if(ctemp[ccol]!=0)

{

c->;t = C->;t+1;

c->;數據[C->;t】。排=烏鴉;

c->;數據[C->;t】。col = ccol

c->;數據[C->;t】。v = CT EMP[ccol];

}

}

}否則

printf("這兩個數組不能相乘");

返回;

}

  • 上一篇:高速走絲線切割的形狀編輯
  • 下一篇:BUG和G什麽意思啊,知道意思的教教我啊~
  • copyright 2024編程學習大全網