五 1 1 稀疏矩陣乘法的快速運算

2021-09-02 05:35:30 字數 2949 閱讀 7479

有矩陣m和n,都是用三元組壓縮儲存,設計高效率演算法求矩陣m*n得到的矩陣q(也用三元組壓縮儲存).

假設矩陣m*n=q 如下

那麼得到的矩陣q有三行三列,第一行中的元素有這樣的關係

所以我們可以這樣,在遍歷到m11時,由於n11,n12,n13是在順序表中連續排列的,所以我們可以建立乙個3個累加器(int qelem[4]=),

遍歷到m11時,先算q11,q12,q13的第一項,累加到累加器中即

然後遍歷到m12時計算第二項,累加到累加器中即

qelem[1]

+=m12*n21,

qelem[2]

+=m12*n22,

qelem[3]

+=m12*n23,

接著遍歷到m13時計算第三項,累加到累加器中即

這樣q中第一行的元素就計算出來了,我們把累加器裡的值存到q矩陣的順序表中就ok了

接著重複上述步驟,遍歷m矩陣的第2行元素,第三行也是同理

這樣每行m中的元素只需遍歷一次,就能計算出m乘以n得到得矩陣q了,效率比普通演算法更高

這裡來看一下**的具體實現,注意這個演算法需要乙個附加資訊,也就是矩陣每行第乙個非零元素在順序表中的位置序號,這個資訊是為了能夠準確遍歷矩陣中的某行所有元素

#include

"stdio.h"

#include

"stdlib.h"

#define maxsize 2000

//線性表0單元不用是為了便於理解程式

//元素型別

typedef

int sqpostype;

typedef

struct

triple;

//三元組

typedef

struct

rlsmatrix;

rlsmatrix m=,,

,,,,

,,,}

}; rlsmatrix n=,,

,,,,

,,,}

};//矩陣相乘演算法

void

multsmatrix

(rlsmatrix m,rlsmatrix n,rlsmatrix &q)

;//一行中每列的元素的累加器

q.sqpos[m_row]

=q.tu+1;

//相乘得到的矩陣每行非零元素在順序表中的位置

int sqpos2_m;

//遍歷到m矩陣的元素的下一行非零元素在順序表中的位置

//為了找出相同行的元素在順序表中的位置範圍

if(m_row

sqpos2_m=m.sqpos[m_row+1]

;//當前行的下一行非零元素在順序表中的位置

else

sqpos2_m=m.tu+1;

//當前行的下一行非零元素在順序表中的位置,因為m_row+1超界了,所以用尾元素位置加一

int sqpos_m;

//矩陣n中被遍歷到的元素在順序表中的位置

//遍歷m矩陣中一行中的所有元素

for(sqpos_m=m.sqpos[m_row]

;sqpos_m

//for sqpos_m

//m中的一行元素已經和n中所有列的元素計算完了,現在遍歷累加器中的元素,將計算得到的q中一行的元素存入順序表

for(

int col=

1;col<=q.nu;col++);

//非零元素存入q矩陣的順序表}}

//for col

}//for m_row

}//顯示三元組

void

print

(rlsmatrix m)

}int

main()

操作結果:

1.可以看到這裡定義的儲存矩陣三元組的結構體,還要儲存矩陣每行第乙個非零元素在順序表中的位置序號,這是為了能夠準確的遍歷到矩陣某一行的所有元素

注意:我們為了更好的理解這個演算法,所以很多陣列零單元都是不使用的

2.演算法中有3個層次的迴圈,第1層迴圈是依次遍歷矩陣m的行,第2層迴圈是遍歷m矩陣某行中的所有元素,第3層迴圈是遍歷n矩陣中某行的所有元素,並分別與第2層迴圈遍歷的m中的某個元素相乘然後結果分別加到q的累加器中.

3.第2層迴圈有兩個同層次的迴圈,

先進行遍歷m某行所有元素的迴圈,通過累加器.計算出q中某行所有元素的值.

然後我們再通過乙個迴圈把累加器裡的值儲存到q矩陣的順序表

7 稀疏矩陣的乘法運算

資料壓縮是提高傳輸 儲存效率一種技術。教材第5章介紹了兩種簡單的壓縮儲存方法。本實驗要求實現兩個稀疏矩陣相乘積的演算法。其中稀疏矩陣非零元素數量小於100.輸入 第1個 稀疏矩陣的行數 列數 非零元個數 三個數都大於0 三元組 第2個 稀疏矩陣的行數 列數 非零元個數 三個數都大於0 三元組 以行為...

稀疏矩陣的乘法

1492.稀疏矩陣的乘法 時限 1000ms 記憶體限制 10000k 總時限 3000ms 描述計算兩個稀疏矩陣的乘法 輸入首先輸入第乙個矩陣的行數和列數,再輸入該矩陣的三元組形式,以0 0 0結束 然後輸入第二個矩陣的行數和列數,再輸入該矩陣的三元組形式,以0 0 0結束 輸出兩個矩陣相乘後得到...

稀疏矩陣儲存 轉置 乘法運算

使用順序儲存結構儲存稀疏矩陣,並實現轉置和乘法運算。include stdio.h include stdlib.h include string.h 順序結構的稀疏矩陣 轉置 乘法 define xishu max 100 define xishu increment 100 typedef st...