对称矩阵压缩存储

对称矩阵压缩存储
本文介绍了一种对称矩阵的压缩存储方法,通过只存储下三角部分来节省内存空间,并提供了一个C++模板类实现。该类支持对压缩后的矩阵进行访问。
压缩矩阵:对称矩阵存储时只需要存储上三角或下三角的数据,所以最多存储n*(n+1)/2个数据。
对称矩阵和对称压缩存储的对应关系:

下三角存储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;
}


### 对称矩阵的定义 对称矩阵是指元素以主对角线为对称轴对应相等的矩阵。在线性代数中,对称矩阵是一个方形矩阵 \( A \),其转置矩阵等于自身,即: \[ A = A^T \] 这意味着如果 \( a_{ij} \) 是矩阵 \( A \) 中第 \( i \) 行第 \( j \) 列的元素,则有 \( a_{ij} = a_{ji} \)[^2]。 ### 对称矩阵的主要性质 #### 特征值和特征向量 对称矩阵具有重要的谱特性。根据谱定理[^1],任何实对称矩阵都可以通过正交变换对角化,也就是说存在一个正交矩阵 \( Q \) 和一个对角矩阵 \( D \),使得: \[ A = QDQ^{-1} \] 其中,\( D \) 的对角线上是对称矩阵 \( A \) 的特征值,而 \( Q \) 的列是对应的特征向量。这些特征值都是实数,并且不同特征值对应的特征向量相互正交。 #### 正定性和半正定性 除了上述基本性质外,对称矩阵还可以进一步分类为正定、负定、半正定或不定矩阵。具体而言: - **正定矩阵**:所有特征值均为正值; - **负定矩阵**:所有特征值均为负值; - **半正定矩阵**:所有特征值均非负; - **不定矩阵**:既有正值也有负值的特征值; 这几种类型的判定可以通过计算二次型来完成。例如,给定一个对称矩阵 \( A \),则对于任意非零向量 \( x \),若 \( x^TAx > 0 \),那么 \( A \) 就是正定矩阵。 ```python import numpy as np def is_symmetric(matrix): """判断输入矩阵是否为对称矩阵""" return np.allclose(matrix, matrix.T) # 测试例子 matrix_example = np.array([[1, 2], [2, 3]]) print(is_symmetric(matrix_example)) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值