對(duì)稱矩陣的壓縮儲(chǔ)存講解
一、存儲(chǔ)矩陣用一個(gè)二維數(shù)組即可;

二、什么是對(duì)稱矩陣:
設(shè)一個(gè)N*N的方陣A,A中任意元素Aij,當(dāng)且僅當(dāng) Aij == Aji(0 <= i <= N-1&& 0 <= j <= N-1),則矩陣A是對(duì)稱矩陣。以矩陣的對(duì)角線為分隔,分為上三角和下三角
三、對(duì)稱矩陣的壓縮儲(chǔ)存:
壓縮存儲(chǔ)稱矩陣存儲(chǔ)時(shí)只需要存儲(chǔ)上三角/下三角的數(shù)據(jù),所以最多存儲(chǔ)n(n+1)/2個(gè)數(shù)據(jù)(相當(dāng)于1+2+…+n,即等差數(shù)列求和)。
對(duì)稱矩陣和壓縮存儲(chǔ)的對(duì)應(yīng)關(guān)系:下三角存儲(chǔ)i>=j, SymmetricMatrix[i][j] ==Array[i*(i+1)/2+j]
四、代碼實(shí)現(xiàn)
#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;
//壓縮儲(chǔ)存過(guò)程
for(int i=0;i<sz;++i)
{
for(int j=0;j<sz;++j)
{
if (i>=j)//_data中儲(chǔ)存下三角的數(shù)據(jù)
{
_data[index]=arr[i*sz+j];
index++;
}
else
break;
}
}
}
//獲取某個(gè)坐標(biāo)的數(shù)據(jù),i和j代表該數(shù)據(jù)在矩陣中的橫縱坐標(biāo)
T GetDate(int i,int j)
{
if (i>=j)//下三角數(shù)據(jù)
{
return _data[i*(i+1)/2+j];
}
else//上三角數(shù)據(jù)
{
std::swap(i,j);//將橫坐標(biāo)和從坐標(biāo)值交換;
return _data[i*(i+1)/2+j];
}
}
//打印矩陣的數(shù)據(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;//儲(chǔ)存數(shù)據(jù)的數(shù)組
int _size;//儲(chǔ)存原始對(duì)稱矩陣的行數(shù)(或列數(shù))
};
測(cè)試代碼:
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);//將二維數(shù)組強(qiáng)制轉(zhuǎn)換為一維數(shù)組指針,是問(wèn)題更簡(jiǎn)單
cm.PrintfMatrix();
return 0;
}
五、運(yùn)行結(jié)果

O(∩_∩)O
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)Fibonacci數(shù)列遞歸
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)Fibonacci數(shù)列遞歸,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
C語(yǔ)言文件操作中 fgets與fputs 函數(shù)詳解
這篇文章主要介紹了C語(yǔ)言文件操作中 fgets與fputs 函數(shù)詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06
c語(yǔ)言printf實(shí)現(xiàn)同一位置打印輸出的實(shí)例
下面小編就為大家?guī)?lái)一篇c語(yǔ)言printf實(shí)現(xiàn)同一位置打印輸出的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09
詳細(xì)解析命令行的getopt_long()函數(shù)
getopt_long支持長(zhǎng)選項(xiàng)的命令行解析,函數(shù)中的參數(shù)argc和argv通常直接從main()的兩個(gè)參數(shù)傳遞而來(lái)2013-09-09
C++ 中CListCtrl的每個(gè)項(xiàng)都顯示不同的提示信息
這篇文章主要介紹了C++ 中CListCtrl的每個(gè)項(xiàng)都顯示不同的提示信息的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下2017-09-09
C++編寫LINUX守護(hù)進(jìn)程的實(shí)現(xiàn)代碼
這篇文章主要介紹了如何使用C++實(shí)現(xiàn)LINUX守護(hù)進(jìn)程,文中代碼非常詳細(xì),供大家學(xué)習(xí)參考,感興趣的小伙伴可以了解下2020-06-06

