順序儲存結構的三元組稀疏矩陣的乘法運算

2021-06-22 09:13:53 字數 2639 閱讀 8561

三元組的含義為(行,列,元素值)

首先判斷是否滿足進行乘法運算的條件:只有當第乙個矩陣的列數與第二個矩陣的行數相等時才可進行運算。

運算的規則如下:矩陣a[m][p]和矩陣b[p][n]相乘得到矩陣c[m][n],則c[m][n]的每一項的計算公式為:

對於用三元組的形式表示的稀疏矩陣,其儲存的內容只有非零元素的值,例如:乙個6行7列有8個非零值的矩陣,對應的三元組形式為:a[6][7]:

((1,2,12),(1,3,9),(3,1,-3),(3,6,14),(4,3,24),(5,2,18),(6,1,15),(6,4,-7))。

乙個7行5列的含有10個非零值的矩陣,對應的三元組的形式為:

b[7][5]:

((1,3,4),(2,1,3),(2,4,2),(3,1,-3),(3,2,1),(4,3,2),(4,2,7),(5,3,8),(6,4,3),(7,2,5))。

我們使用的演算法描述如下:

1、用a[6][7]的第乙個三元組(1,2,12)的列值2與b[7][5]的7個三元組的行值逐個進行比較,

(1)第二個矩陣中第乙個符合相等條件的三元組:(2,1,3),則進行運算得到:c[1][1] = 12*3=36;c矩陣的第乙個元素為(1,1,36),c中元素個數為1。此時c中

對應的三元組為:((1,1,36)。

(2)第二個矩陣中第乙個符合相等條件的三元組:

(2,4,2),則進行運算得到:c[1][4] = 12*2=24;對應的三元組為(1,4,24)。將該結果與第一次的結果

進行行列值的比較,若行列值都相等,則將後者的元素值加到前者元素值之上,再將後者的結果釋放,c中的元素個數保持不變,若行列值有乙個不相等,則兩個結果都儲存,此時c中元素個數增加乙個。本例中,列值不相等,故c中元素個數為2。將該三元組加到c的三元組中,此時c中

對應的三元組為:(

(1,1,36),(1,4,24)

)。(3)第二個矩陣中再沒有與第乙個矩陣的第乙個三元組滿足可以相乘條件的元素,則開始對第乙個矩陣的第二個三元組進行操作。

2、用a[6][7]的第二個三元組(1,3,9)的列值3與b[7][5]的7個三元組的行值逐個進行比較,

1)第二個矩陣中第乙個符合相等條件的三元組:(3,1,-3),則進行運算得到:c[1][1] = 9*-3=-27;對應的三元組為(1,1,-27),將該三元組的行列值與之前的兩個元素的行列值進行比較:若存在行列值都相等的元組,則將後者的元素值加到前者元素值之上,再將後者的結果釋放,c中的元素個數保持不變,若行列值有乙個不相等,則將該結果儲存,此時c中元素個數加1。本例中,(1,1,-27)的行列值與c中第乙個元組的行列值相同,故將該元素值-27加到(1,1,36)中得到(1,1,9),即c矩陣的第乙個三元組的元素值發生變化,此時c中元素個數仍為2。此時c中

對應的三元組為:(

(1,1,9),(1,4,24))

(2)第二個矩陣中第二個符合相等條件的三元組:(3,2,3),則進行運算得到:c[1][2] = 12*3=36;對應的三元組為(1,2,24)。將該結果c中現有的三元組進行行列值的比較,若行列值都相等,則將後者的元素值加到前者元素值之上,再將後者的結果釋放,c中的元素個數仍為1,若行列值有乙個不相等,則兩個結果都儲存,此時c中元素個數為2。本例中,列值不相等,故c中元素個數為3。將該三元組加到c的三元組中,此時c中對應的三元組為:

((1,1,9),(1,4,24),(1,2,24)

)(3)第二個矩陣中再沒有與第乙個矩陣的第二個三元組滿足可以相乘條件的元素,則開始對第乙個矩陣的第三個三元組進行操作。

3、每次都進行與1和2相似的操作,從第二個矩陣的所有三元組中尋找行值與第乙個矩陣的第i個三元組的列值相等的三元組,計算得到對應的結果三元組,若該三元組的行列值與c中現有的三元組的行列值相同,則將兩個三元組的元素值進行相加,這個相加的過程就相當於是4、對得到的結果矩陣按行列值進行重排序。

typedef int elemtype;

typedef structtriple;

typedef structtsmatrix;

//當第乙個矩陣的列值等於第二個矩陣的行值時,對這兩個矩陣進行相乘的運算並將結果存在result矩陣中

void multsmatrix( tsmatrix *matrix1, tsmatrix *matrix2, tsmatrix *result )

else

}k++;}}

i++;

}result->non_zero = k;

//重新為result->data分配適合大小的儲存空間

result->data = ( triple *)realloc( result->data, sizeof( triple ) * ( result->non_zero ) );

reordersmatrix( result );

} }}

稀疏矩陣的三元組順序儲存

該資料結構的操作主要是陣列的相加 和相乘,這兩個演算法全是我個人所寫,絕無參考,經測試應該少有bug a.h include define false 0 define true 1 define ok 1 define error 0 define max size 100 typedef int...

稀疏矩陣的三元組儲存演算法

稀疏矩陣,是零元素較多的矩陣。一般只要滿足 t 1 3 m n,t是非零元素個數,mn是矩陣行列數,就可以用三元組表示稀疏矩陣,可以節省空間。稀疏矩陣的壓縮儲存採用三元組的方法實現。其儲存規則是 每乙個非零元素佔一行,每行中包含非零元素所在的行號 列號 非零元素的數值。為完整描述稀疏矩陣,一般在第一...

稀疏矩陣(三元組順序表實現)

定義了乙個稀疏矩陣類,有轉置和相乘,相加三個功能,主要是熟悉稀疏矩陣的三元組順序表儲存的一些操作,和一般的矩陣不同的地方,兩個轉置的演算法,第乙個是較容易想到的,書上管它叫 按需點菜 法,就是按一開始列的順序,乙個個轉為新矩陣中行的順序。第二個叫作 按位就坐 法,就是條件兩個輔助陣列,確定每一列中第...