對稱矩陣的壓縮儲存講解
更新時間:2019年02月20日 15:28:14 作者:gogogo_sky
今天小編就為大家分享一篇關于對稱矩陣的壓縮儲存講解,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
一、存儲矩陣用一個二維數組即可;
二、什么是對稱矩陣:
設一個N*N的方陣A,A中任意元素Aij,當且僅當 Aij == Aji(0 <= i <= N-1&& 0 <= j <= N-1)
,則矩陣A是對稱矩陣。以矩陣的對角線為分隔,分為上三角和下三角
三、對稱矩陣的壓縮儲存:
壓縮存儲稱矩陣存儲時只需要存儲上三角/下三角的數據,所以最多存儲n(n+1)/2個數據(相當于1+2+…+n,即等差數列求和)。
對稱矩陣和壓縮存儲的對應關系:下三角存儲i>=j, SymmetricMatrix[i][j] ==Array[i*(i+1)/2+j]
四、代碼實現
#include<iostream> using namespace std; template<class T> class CompressionMatrix { public: CompressionMatrix(T* arr,int sz) :_data(new T[sz*(sz+1)/2]) ,_size(sz) { int index=0; //壓縮儲存過程 for(int i=0;i<sz;++i) { for(int j=0;j<sz;++j) { if (i>=j)//_data中儲存下三角的數據 { _data[index]=arr[i*sz+j]; index++; } else break; } } } //獲取某個坐標的數據,i和j代表該數據在矩陣中的橫縱坐標 T GetDate(int i,int j) { if (i>=j)//下三角數據 { return _data[i*(i+1)/2+j]; } else//上三角數據 { std::swap(i,j);//將橫坐標和從坐標值交換; return _data[i*(i+1)/2+j]; } } //打印矩陣的數據 void PrintfMatrix() { for (int i=0;i<_size;++i) { for (int j=0;j<_size;++j) { cout<<GetDate(i,j)<<" "; } cout<<endl; } } ~CompressionMatrix() { if (_data!=NULL) { delete[] _data; _data=NULL; _size=0; } } protected: T* _data;//儲存數據的數組 int _size;//儲存原始對稱矩陣的行數(或列數) };
測試代碼:
int main() { int a[5][5]= { {0,1,2,3,4}, {1,0,1,2,3}, {2,1,0,1,2}, {3,2,1,0,1}, {4,3,2,1,0}, }; CompressionMatrix<int> cm((int*)a,5);//將二維數組強制轉換為一維數組指針,是問題更簡單 cm.PrintfMatrix(); return 0; }
五、運行結果
O(∩_∩)O
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關內容請查看下面相關鏈接