用三元組儲存稀疏矩陣及其快速轉置

2021-10-08 12:09:43 字數 2114 閱讀 5404

稀疏矩陣可以用乙個三元組陣列表示,陣列每個元素是乙個三元組,三元組形式為

(矩陣行號,矩陣列號,元素值)

三元組個數,即陣列長度,為稀疏矩陣的非零元素個數。

三元組元素按照行號遞增,列號遞增的方式排序。

例如矩陣m:

[ 10

0000

020]

\begin 1 & 0 & 0 \\ 0 & 0 & 0 \\ 0 & 2 & 0 \end

⎣⎡​100

​002

​000

​⎦⎤​

對應的的三元組陣列為:

(0,0,1)

(2,1,2)

輸入:原矩陣a的三元組陣列

輸出:原矩陣的轉置矩陣b的三元組陣列

轉置相當於把a的三元組陣列每個元素的行列交換,然後按照列遞增,行遞增的順序重排,從而演算法類似於桶排序,將列相同的三元組按它們在a矩陣的三元組陣列中的先後順序放到同乙個桶中,所有桶按列號從小到大排。從而需要兩個大小均為矩陣a列數的陣列row_size和row_start,row_size記錄每個桶的大小,row_start記錄每個桶下乙個存進來的元素在b矩陣的三元組陣列中的下標,每在桶中放入乙個元素,下標自增以存放下乙個元素。

例如矩陣m:

[ 10

0000

0020

0000

0030

0000

450]

\begin 1 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 2 & 0 \\ 0 & 0 & 0 & 0 & 0 \\ 0 & 3 & 0 & 0 & 0 \\ 0 & 0 & 4 & 5 & 0 \end

⎣⎢⎢⎢⎢⎡

​100

00​0

0030

​000

04​0

2005

​000

00​⎦

⎥⎥⎥⎥

⎤​對應的三元組陣列變為其轉置矩陣的三元組陣列:

row_size陣列為,初始的row_start陣列為

列數相同則顏色相同,乙個顏色即為乙個「桶」,也就是轉置矩陣一行的所有非零元素,將每種顏色按列號從小到大排序,由於在原陣列中就是按行號遞增的順序存放,所以同種顏色的三元組順序保持不變。

預先定義兩個陣列row_size, row_start分別儲存b每行的非零元素個數和當前

非零元素在三元組陣列中的下標,row_size陣列所有元素初始化為0

elements_a: a的三元組陣列

elements_b: b的三元組陣列

col_num: a的列數,b的行數,也是桶的個數

// 統計每個桶的大小,即b每行非零元素個數

1、對elements_a中每個元素triple:

row_size[triple.col]

++// 計算b每行非零元素在elements_b中的初始下標

2、對row_start陣列中的第i

(i從1到col_num-

1)個元素:

row_start[i]

= row[start[i-1]

+ row_size[i-1]

// 遍歷elements_a,將其放入elements_b中對應的桶中

3、對elements_a中的每個元素triple:

// b中對應三元組就是把triple的行號列號交換,值不變

elements_b[row_start[triple.col]

].col = triple.row

elements_b[row_start[triple.col]

].row = triple.col

elements_b[row_start[triple.col]

].value = triple.value

// 桶中下一元素的下標

row_start[triple.col]

++

實現**在這裡的sparse_matrix_transpose.cpp,其中標頭檔案是myheaders資料夾中的sparse_matrix.transpose.

三元組稀疏矩陣快速轉置

稀疏矩陣是只儲存非零元的行值 列值 元素值 data 0 來儲存矩陣的行數 列數 非零元個數 struct position struct list void quick transpose list l,list s 記錄每一列第乙個非零元的位置 int col num l.data 0 col ...

稀疏矩陣三元組的快速轉置

include include using namespace std define maxsize 1024 define elemtype int define status int 三元組 typedef struct tripletriple 由三元組組成的表 typedef struct ...

五 1 2 稀疏矩陣快速轉置 三元組儲存

乙個稀疏矩陣m用三元組表示,設計高效率的演算法將矩陣m轉置後得到矩陣n 1.我們先對矩陣m的順序表進行遍歷,用陣列num記錄m矩陣每一列非零元素分別有多少個,這也就是逆矩陣n每一行的非零元素有多少個.2.利用逆矩陣n每一行的非零元素有多少個這個資訊,我們就可以求出逆n矩陣中每一行非零元素在順序表中的...