個人筆記 稀疏矩陣的壓縮儲存與兩種轉置方法

2021-10-10 06:24:32 字數 3314 閱讀 1433

在數學中,矩陣(matrix)是乙個按照長方陣列排列的複數或實數集合 ,最早來自於方程組的係數及常數所構成的方陣。這一概念由19世紀英國數學家凱利首先提出。

就是在矩陣中,若數值為0的元素數目遠遠多於非0元素的數目,並且非0元素分布沒有規律時,則稱該矩陣為稀疏矩陣,是一種特殊的矩陣。為了節省空間,我們可以對此類矩陣進行壓縮儲存。所謂壓縮儲存,是指為每個非零的元分配乙個儲存空間,對零元不分配空間。

//定義兩個結構體

typedef

struct

triple;

typedef

struct

tsmarix;

注意:檢查非零元素個數是否小於等於行數乘列數;

檢查是否能攔截元素下標重複輸入;

檢查是否能控制輸入的非零元素的下標是遞增的(即按照行序輸入,先輸入小的行下標,再輸入較大的行下標;行序相等時,先輸入小的列下標)。

status createsmatrix

(tsmarix &m)

while

(true);

for(

int k=

1;k<=m.tu;k++)if

(m.data[k]

.y>m.nu || m.data[k]

.y<=0)

for(

int i=

1;iif(

!flag && k!=1)

else

if(m.data[k]

.x==m.data[k-1]

.x && m.data[k]

.y.y)}

if(flag)

break;}

while

(true);

}return ok;

}return ok;

}

//啊這,就這啊~

status destroysmatrix

(tsmarix &m)

//就這

//因為儲存時就是行遞增儲存,行相等時列遞增儲存,所以輸出也是以這種形式輸出

void

printsmatrix

(tsmarix m)

else

cout<<

"0 "

;//其餘部分用0來填充

} cout<}}

status	transposesmatrix

(tsmarix m,tsmarix &a)

}return ok;

}

兩個for迴圈,emm時間複雜度有點高,試試下面這個

首先定義兩個陣列

num[i]用來存m中第i列中非零元的個數

cpot[i]指示m中第i列的第乙個非零元在儲存到b裡的恰當位置

顯然:copt[1]=1;

copt[i]=cpot[i-1]+num[i-1];實在不理解就自己找幾個數試試就理解了

算了,這裡還是給大家試試吧

2*2矩陣

1 23 0

col(列)12

num[col]21

copt[col]13

即稀疏矩陣m的三元組為ij

v111

1222

13稀疏矩陣b(即轉置後的m)的三元組為ij

v111

1232

12先找m中第乙個非零元(1)的列(1),由cpot得知應插入到b中的第p(1)個位置,然後cpot[1]++,也就是cpot[1]變為2;

接著找m中第二個非零元(2)的列(2),由cpot得知插入到b中第p(3)個位置

,然後cpot[2]++,也就是cpot[2]變為4;

找到m中最後乙個非零元(3)的列(1),因為cpot[1]=2了,所以插入到b中的第p(2)個位置,然後cpot[1]++,也就是cpot[1]變為3;

為什麼cpot要加1,想必大家都清楚了吧

status	fasttransposesmatrix

(tsmarix m,tsmarix &b)

}return ok;

}

這不就變成都是1個的for迴圈了,優化了吧

#include

#define maxsize 100

#define status int

#define ok 1

#define error 0

using

namespace std;

typedef

struct

triple;

typedef

struct

tsmarix;

status createsmatrix

(tsmarix &m)

while

(true);

for(

int k=

1;k<=m.tu;k++)if

(m.data[k]

.y>m.nu || m.data[k]

.y<=0)

for(

int i=

1;iif(

!flag && k!=1)

else

if(m.data[k]

.x==m.data[k-1]

.x && m.data[k]

.y.y)}

if(flag)

break;}

while

(true);

}return ok;

} status destroysmatrix

(tsmarix &m)

void

printsmatrix

(tsmarix m)

else

cout<<

"0 ";}

cout

(tsmarix m,tsmarix &a)

}return ok;

}status fasttransposesmatrix

(tsmarix m,tsmarix &b)

}return ok;

}int

main()

}while

(order>=0)

;return0;

}

「每乙個不曾起舞的日子,都是對生命的辜負」

稀疏矩陣壓縮儲存與還原

clc clear h 1 1 1 1 0 1 0 1 1 0 1 0 1 0 1 1 0 1 1 1 0 1 1 1 c 1 2 3 4 5 6 m,n size h for i 1 m k 1 for j 1 n if h i,j 0 index col i,k j k k 1 endend e...

稀疏矩陣的壓縮儲存

include include using namespace std templateclass sparsematrix sparsematrix 訪問稀疏矩陣中row行col中的元素 t access int row,int col it return invalid for size t i...

稀疏矩陣的壓縮儲存

稀疏矩陣的壓縮儲存 實現稀疏矩陣壓縮儲存,並實現矩陣轉置和求和。輸入矩陣時,首先需要輸入非零元素的個數,然後分別輸入矩陣的 行號,列號和值。輸完2個矩陣後,自動進行計算第乙個矩陣的轉置以及兩個矩陣的和。例如 輸入如下 100 90 5 矩陣的行數為100,列數為90,共5個非零元素。1 10 100...