數組是你們已經很熟悉的一種數據類型,幾乎全部的程序設計語言都把數組類型定爲固有類型,在這我就再也不介紹數組的基礎知識(如:定義等知識)了。下面咱們直接看矩陣的儲存,通常狀況下,矩陣使用二維數組儲存的,可是,對於數據量很是大的矩陣,這樣儲存就顯得乏力了,又浪費空間資源,下面咱們就看看有沒有更好的儲存方法呢。很明顯,咱們能夠用一位數組壓縮儲存有些矩陣,下面就來研究幾個特殊矩陣吧。ios
(1)對稱矩陣數組
若n階矩陣A中的元素知足下述性質:aij=aji 0<=i,j<=n-1則稱爲n階對稱矩陣。spa
很明顯,咱們只用爲每一對對稱元素分配一個儲存空間,則可將n2個元素壓縮儲存到n(n+1)/2個元的空間中。設計
假設以一維數組a[n(n+1)/2]做爲n階對稱矩陣的儲存結構,則a[k]與矩陣元素之間存在着一一對應的關係:當i>=j時,k=i*(i+1)/2+j;當i<j時,k=j*(j+1)+i;code
代碼以下:blog
1 #include<iostream> 2 #include<iomanip> 3 using namespace std; 4 int main() 5 { 6 while(1) 7 { 8 int n,a[1000]; 9 cin>>n; 10 cout<<"請輸入"<<n*(n+1)/2<<"個數:"; 11 for(int i=0;i<n*(n+1)/2;i++) 12 cin>>a[i]; 13 for(int i=0;i<n;i++) 14 { 15 for(int j=0;j<n;j++) 16 { 17 if(i>=j) 18 cout<<setw(3)<<a[i*(i+1)/2+j]<<" "; 19 else 20 cout<<setw(3)<<a[j*(j+1)/2+i]<<" "; 21 } 22 cout<<endl; 23 } 24 cout<<"節約"<<n*n-n*(n+1)/2<<"個空間."<<endl; 25 } 26 27 return 0; 28 }
(2)上、下三角矩陣ip
所謂上、下三件矩陣是指矩陣上(下)三角(不包括對角線)中的元素均爲常數c或0的n階矩陣。則除了和對稱矩陣同樣,只儲存其下(上)三角中的元素以外,再加一個儲存常數c的儲存空間便可。ci
示例代碼以下:資源
#include<iostream> #include<iomanip> using namespace std; int main() { while(1) { int n,a[1000]; cin>>n; cout<<"請輸入"<<n*(n+1)/2+1<<"個數:"; for(int i=0;i<n*(n+1)/2+1;i++) cin>>a[i]; //上三角 for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(i<=j) cout<<setw(3)<<a[(2*n-i+1)*i/2+(j-i)]<<" "; else cout<<setw(3)<<a[n*(n+1)/2]<<" "; } cout<<endl; } cout<<"節約"<<n*n-n*(n+1)/2-1<<"個空間."<<endl; } //下三角 /*for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(i>=j) cout<<setw(3)<<a[i*(i+1)/2+j]<<" "; else cout<<setw(3)<<a[n*(n+1)/2]<<" "; } cout<<endl; }*/ return 0; }
(3)對角矩陣(帶狀矩陣)it
對角矩陣是指全部的非0元素都集中在以主對角線爲中心的袋裝區域中,即除了主對角線上和直接在對角線上、下方若干條對角線上的元素以外,全部其餘的元素皆爲0。
假設對角矩陣的半寬爲d,則對於n階矩陣須要n*(2*d+1)-d*d-d+1個儲存空間,原理與上面的幾乎同樣,就不重複了,下面看實現代碼吧
#include<iostream> #include<cmath> #include<iomanip> using namespace std; int main() { int n,d,a[100],m; cin>>n>>d; cout<<"請輸入"<<(n*(2*d+1)-d*d-d+1)<<"個數:"; for(int i=0;i<n*(2*d+1)-d*d-d+1;i++) cin>>a[i]; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(fabs(i-j)<=d) cout<<setw(3)<<a[(i*(2*d+1)-d)+(j-i+d)]<<" "; else cout<<setw(3)<<a[n*(2*d+1)-d*d-d]<<" "; } cout<<endl; } cout<<"節約"<<n*n-(n*(2*d+1)-d*d-d+1)<<"個空間."<<endl; return 0; }
上面是比較簡單的矩陣壓縮儲存,更復雜的待續。。。。