這次博文寫的有點長,因為我得構思,所以今天晚上(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...