标签:对称矩阵
若设一个N*N的方阵A,A中任意元素Aij,当且仅当Aij == Aji(0 <= i <= N-1 && 0 <= j <= N-1),则矩阵A是对称矩阵。以矩阵的对角线为分隔,分为上三角和下三角。 压缩存储称矩阵存储时只需要存储上三角/下三角的数据,所以最多存储n(n+1)/2个数据。 对称矩阵和压缩存储的对应关系:下三角存储i>=j, SymmetricMatrix[i][j] == Array[i*(i+1)/2+j] #define _CRT_SECURE_NO_WARNINGS 1 #pragma once #include<iostream> using namespace std; template<class T> class SymmetricMatrix { public: SymmetricMatrix(T* a, size_t size) :_size(size*(size+1)/2) ,_a(new T[_size]) ,_n(size) { size_t index = 0; for (size_t i = 0; i < size; ++i) { for (size_t j = 0; j < size; ++j) { if (i >= j) { _a[index++] = a[i*size+j];//将对称矩阵转换为压缩矩阵 } else { break; } } } } ~SymmetricMatrix() { if (_a) { delete[] _a; _a = NULL; _size = 0; } } T& Access(size_t i, size_t j) //获取节点 { if (i < j)//如果为上三角矩阵,交换行和列的位置 { swap(i, j); } return _a[i*(i+1)/2+j]; } void Display() //打印 { for (size_t i = 0; i < _n; ++i) { for (size_t j = 0; j < _n; ++j) { if (i >= j) { cout<<_a[i*(i+1)/2+j]<<" "; } else { cout<<_a[j*(j+1)/2+i]<<" "; } } cout<<endl; } cout<<endl; } protected: size_t _size;//压缩矩阵 T* _a;//矩阵大小 size_t _n; }; void TestSymmetricMatrix() { 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}, }; SymmetricMatrix<int> sm((int*)a, 5); //建立压缩矩阵 sm.Display(); }; int main() { TestSymmetricMatrix(); getchar(); return 0; }
本文出自 “顺势而为” 博客,请务必保留此出处http://lk123456.blog.51cto.com/10831443/1765201
标签:对称矩阵
原文地址:http://lk123456.blog.51cto.com/10831443/1765201