在數學中,矩陣(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...