係數矩陣的儲存方式:三元組
typedef
struct triple_element triple_element;
三元組用於儲存矩陣的每乙個元素
額外需要乙個表頭來表示整個矩陣:
typedef
struct triple_matrix triple_matrix;
初始化及輸入矩陣:
triple_matrix *
inittriplematrix
(int maxrow,
int maxcol,
int elementcount)
初始化矩陣需要動態申請兩個空間:①表頭(指向矩陣) ②元素個數為elementcount的陣列(用於儲存矩陣各元素)
void
inputtriplematrix
(const triple_matrix *matrix)
}
由使用者輸入矩陣內容
以上兩個函式都比較好理解,沒有太多需要深入思考的問題
列印矩陣:
void
showtriplematrix
(const triple_matrix *matrix)
else
}printf
("\n");
}}
表面是遍歷矩陣資料陣列完成遍歷,實際隱藏的內部邏輯有 需要矩陣元素陣列先按行公升序,同行需要按列公升序
這為矩陣的轉置新增了乙個難題
轉置矩陣:
我們的手工過程通常是直接將行列轉換即可,但是由於列印矩陣函式的內部邏輯,我們交轉行列還需要進行排序,
最笨的辦法就是陣列內的元素直接交換行列,再依據行列依次公升序排列即可。
但是有更方便的辦法:
indexarr =
(int*)
calloc
(sizeof
(int
), matrix->maxcol +1)
;for
(index =
0; index < matrix->elementcount; index++
)
我們首先構建乙個陣列, 目的是統計出轉置後當前行上一行的非零元素個數
例如這組資料,轉置後的第七行前一行第六行按陣列表示有兩個元素。
for
(index =
1; index < matrix->maxcol +
1; index++
)
接著陣列初始化完成後,再進行一次追加操作,這樣陣列含義就發生了改變:
當前陣列下標為轉置後的行,其對應的陣列元素表示此行第乙個元素在陣列中對應的下標。
因為追加之前表示的是該行上一行有效元素個數,那麼追加後就是該行之前全部有效元素個數,而矩陣資料陣列就是用來存放有效陣列,下標就是該資料之前的有效元素個數,所以這兩個數值是對應的。
左側是轉置前的元素,右側是轉置後的,按照我們製造出來的陣列,轉置後第七行**之前第七列)的第乙個元素應該在第九個位置儲存。
通過這個陣列和矩陣,我們就可以得出轉置前的元素及其位置,還有轉置後每行第乙個非零元素在矩陣陣列中的儲存位置。
result =
inittriplematrix
(matrix->maxcol, matrix->maxrow, matrix->elementcount)
;for
(index =
0; index < matrix->elementcount; index++
)
接下來申請乙個新的表頭指向轉置後的矩陣,開始轉置工作。
首先陣列下標對應的是轉置後的行(即轉置前的列),首先取出即將要操作的行,indexarr[colindex]
可取出 當前行第乙個有效元素在轉置後的元素陣列中的下標(即我們找到了轉置後元素所要存放的位置),找到位置下一步就進行賦值操作,行列互換,值不變。
在我們賦值過後,有乙個細節,我們現在對該行第乙個元素進行賦值,因為我們的矩陣先後按行按列公升序排序,所以在矩陣元素陣列中同一行下乙個元素一定在同一行上乙個元素緊挨著之後存放。
當前行第乙個有效元素位置indexarr[colindex]
, 那麼下乙個有效元素位置就是上乙個有效元素的下乙個位置,即indexarr[colindex]++
即可
總結
重點思想是矩陣轉置中對轉置後元素所存下標進行獲取,通過得到每一前行有效元素個數,再進行追加就能得到前所有行的有效元素個數,這樣和轉置後矩陣資料陣列的下標意義相同。
稀疏矩陣的轉置 稀疏矩陣的快速轉置原理及其演算法
關於稀疏矩陣的快速轉置法,首先得明白其是通過對三元表進行轉置。如果誤以為是對矩陣進行轉置,毫無疑問就算你想破腦袋也想不出個所以然,別陷入死胡同了!對於乙個三元表,行為i,列為j,值為v。需將其i與j的值對調才能得到新的三元表,但是如果直接進行轉換,得到的新的三元表的順序是混亂的,不符合三元表的規則。...
稀疏矩陣轉置
輸出稀疏矩陣的轉置矩陣。行列均不大於20 第一行輸入兩個正整數n和m,分別表示矩陣的行數和列數,然後輸入矩陣三元組,最後輸入 0 0 0 表示結束輸入。轉置後的矩陣。include include define maxsize 100 typedef struct triple typedef st...
稀疏矩陣轉置矩陣
num 矩陣a中某列的非零元素的個數 cpot 初值表示矩陣a中某列第乙個非零元素在b中的位置,並有如下遞推 cpot 1 0 cpot col cpot col 1 num col 1 2 col nu end right.const int maxterm 100 struct sparsema...