1. 程式人生 > >對稱矩陣壓縮儲存

對稱矩陣壓縮儲存

下三角儲存i>=j,SymmetricMatrix[i][j] == Array[i*(i+1)/2+j]//壓縮儲存矩陣
template<class T>
class Square
{
public:
Square(T *arr,size_t N)
:_row(N)
, _col(N)
{
size_t idx = 0;
P_data = new T[(N*(N + 1))>>1];
for (size_t i = 0; i < N; ++i)
{
for (size_t j=0; j <=i; ++j)
{
P_data[idx++] = arr[i*N + j];
}
}
}
T Acess(int row, int col)
{
if (col>=row)
std::swap(row, col);
return (P_data[row*(row + 1) / 2 + col]);
}
const T& Acess(int row, int col)const
{
if (col > row)
std::swap(row, col);
return (P_data[row*(row + 1) / 2 + col]);
}


friend  ostream& operator << (ostream& output, Square<T>& s)
{
for (size_t i = 0; i < s._row; ++i)
{
for (size_t j = 0; j < s._col; ++j)
{
output << s.Acess(i, j) << " ";
}
output << endl;
}
return output;
}
~Square()
{
if (P_data)
{
delete[]P_data;
P_data = NULL;
}
}
private:
T *P_data;
size_t _row;
size_t _col;
};


int main()
{
int arry[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 }
};
Square <int>s(*arry, sizeof(arry) / sizeof(arry[0]));
cout << s.Acess(4, 1) << endl;
cout << s.Acess(1, 4) << endl;
cout << s << endl;
system("pause");
return 0;
}