稀疏矩陣轉置多種演算法詳解

2021-07-07 03:48:07 字數 1927 閱讀 5246

這次博文寫的有點長,因為我得構思,所以今天晚上(11.10)寫一點,另外還有個重要的任務,因為再過40分鐘就是剁手節了,過了今晚我不止是乙個光棍,更是乙個窮光棍、、、、我該怎麼辦。。。求攔截。

不扯了正題,今天就先寫寫矩陣轉置吧,現實中轉置麼,不就區區乙個轉置麼,那有什麼,瞅一眼就轉過來了。計算機就是計算機,他沒有相發也沒有眼睛,那麼我們就來告訴他怎麼思考,怎麼走路吧。

方法一:一般轉置(簡單)

轉置矩陣: 乙個 m×n 的矩陣 m,它的轉置 t 是乙個

n×m 的矩陣,且 t (i, j) = m[ j, i], 1≤i≤n, 1≤j≤m,

即 m 的行是 t 的列, m 的列是 t 的行。

m:原矩陣

t:轉置之後的矩陣

ps:講轉置之前需要介紹一下稀疏矩陣的三元組壓縮儲存方式,就是將稀疏矩陣的非零元素的 (行座標,列座標,元素值)

例如:m陣列的第一行第二列的12在三元組裡的表示為 (1,2,12)

三元組順序表儲存結構:

這個結構就是乙個陣列

triple: 申明了乙個型別,包含了 i(行)、j(列)、e(元素資料)

tsmatrix:定義了triple型別的陣列儲存行列資料元素資訊,mu(總行數)、nu(總列數)tu(非零元素個數)

下面是儲存之後的結果

triple型別的data陣列長度在定義的時候長度是maxsize+1是為了在data[0]空出來乙個位置使 陣列小標與矩陣的行列下標對應,圖中data[0]的位置 6 7 8 是為了方便講解寫的,實際上是空

下圖是簡單轉置的解題思路

解析:

1)將mu、nu互換

2)將data陣列中 i,j對應的元素位置互換

3)把新的三元組t按行順序排列,所以以i從小到大按順序將三元組

排序 簡單寫法

for (col = 1; col <= m.nu; ++ col)

for (p = 1; p <= m.tu; ++ p)

if ( m.data[p].j == col )

下面把完整的演算法用弄上來,這樣看著更清楚些。

時間複雜度:

兩次迴圈,三元組多長需要遍歷多長,這效率可想而知。

所以牛人們相除了了非常6的乙個演算法,我在下面加乙個方法一的優缺點,明天寫吧,,,我要準備搶衣服啦哈哈哈哈哈哈

來,繼續。。。

方法二:按 m 的行序轉置 —— 快速轉置

這個方法簡單,是因為演算法中包含了兩個有特殊用法的陣列,儲存了非常重要的資訊,簡單說下演算法的步驟

1)確定 m 的第 1 列的第 1 個非零元在 t.data 中的位置。 1

2)確定 m 的第 col -1 列的非零元個數。 存入陣列 num[m.nu]

3)確定 m 的第 col 列的第乙個非零元在t.data 中的位置。

存入陣列 cpot[m.nu]

cpot[1] = 1;

cpot[col]=cpot[col–1]+num[col–1] 2≤col≤a.nu

稀疏矩陣轉置

輸出稀疏矩陣的轉置矩陣。行列均不大於20 第一行輸入兩個正整數n和m,分別表示矩陣的行數和列數,然後輸入矩陣三元組,最後輸入 0 0 0 表示結束輸入。轉置後的矩陣。include include define maxsize 100 typedef struct triple typedef st...

稀疏矩陣的轉置演算法

關於陣列,大家並不陌生,幾乎所有的程式語言都把陣列型別設為了固有型別。陣列是n n 1 個相同型別資料元素構成的有限序列,它是下標 值偶對的集合,即集合中的每乙個元素都是由乙個值和一組下標組成的。陣列一般分為一維 二維 三維陣列,其中二維陣列也稱為矩陣,本文主要講解對於矩陣中稀疏矩陣的相關操作演算法...

稀疏矩陣轉置矩陣

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...