對稱矩陣及對稱矩陣的壓縮存儲

設一個N*N的方陣A,A中任意元素A[i][j],當且僅當A[i][j] == A[j][i](0 <= i <= N-1 && 0 <= j <= N-1),則矩陣A是對稱矩陣。以矩陣的對角線爲分隔,分爲上三角和下三角。

wKiom1cMz5zzQr_rAAAb3l_RgBs093.png

如上圖,對稱矩陣壓縮存儲存儲時只需要存儲上三角/下三角的數據,一般情況下用下三角存儲所以最多存儲n(n+1)/2個數據。

對稱矩陣和壓縮存儲的對應關係:

下三角存儲i>=j,  SymmetricMatrix[i][j] == Array[i*(i+1)/2+j]

#define _CRT_SECURE_NO_WARNINGS 1

#include<iostream>
#include<assert.h>
using namespace std;

template<class T>
class SymmetricMatrix
{
public:
	SymmetricMatrix(T* array, size_t n)
	{
		_arraySize = n*(n + 1) / 2;
		_size = n;
		_array = new T[_arraySize];
		assert(array);
		for (size_t i = 0; i < n; i++)
		{
			for (size_t j = 0; j < n; j++)
			{
				_array[i*(i + 1) / 2 + j] = array[i*n + j];
			}
		}
	}
	T& GetPos(size_t row, size_t col)    // 獲取節點
	{
	      //如果該位置爲上三角的,利用對稱原理,交換該位置的行和列即可
		if (row < col)   
		{
			swap(row, col);
		}
		return _array[row*(row + 1) / 2 + col];
	} 
	void Display()     //打印
	{
		for (int i = 0; i < _size; i++)
		{
			for (int j = 0; j < _size; j++)
			{
				if (i >= j)
				{
					cout << _array[i*(i + 1) / 2 + j] << " ";
				}
				else if (i<j)
				{
					cout << _array[j*(j + 1) / 2 + i] << " ";
				}
			}
			cout << endl;
		}
		cout << endl;
	}
private:
	T *_array;      //壓縮矩陣
	size_t _size;   //方陣大小_size*_size
	size_t _arraySize;   //壓縮矩陣的總大小
};

int main()
{
	int Matrix[][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 },

	};
	SymmetricMatrix<int> mat((int *)Matrix, 5);  //建立壓縮矩陣,並用Matrix矩陣初始化
	mat.Display();
	cout << mat.GetPos(1, 2) << endl;
	system("pause");
	return 0;
}

wKiom1cM0iOQjcDHAAANmmpQlQU829.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章