稀疏矩陣可以用乙個三元組陣列表示,陣列每個元素是乙個三元組,三元組形式為
(矩陣行號,矩陣列號,元素值)
三元組個數,即陣列長度,為稀疏矩陣的非零元素個數。
三元組元素按照行號遞增,列號遞增的方式排序。
例如矩陣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
000
0030
000
040
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矩陣中每一行非零元素在順序表中的...