【数据结构】对称矩阵及对称矩阵的压缩存储

对称矩阵:

设一个N*N的方阵A,A中任意元素Aij,当且仅当Aij == Aji(0 <= i <= N-1 && 0 <= j <= N-1),则矩阵A是对称矩阵。以矩阵的对角线为分隔,分为上三角和下三角。

如下面矩阵:

对称矩阵压缩存储时只需要存储i*(i+1)/2个数据。

对称矩阵与压缩矩阵的关系是:

对称矩阵SymmetricMatrix[i][j] =压缩矩阵Array(i*(i+1)/2+j)。

下面我实现一下对称矩阵存储在压缩矩阵以及将压缩矩阵中的元素还原成对称矩阵打印出来的代码。

代码如下:


#include<iostream>
using namespace std;
template<class T>
class SymmtrixMatrix
{
public:
    SymmtrixMatrix(T* a, size_t size)
        :_a(new T[size*(size+1)/2])
        , _size(size*(size + 1) / 2)
    {
        for (int i = 0; i < size; i++)
        {
            for (int j = 0; j < size; j++)
            {
                if (i >= j)
                {
                    //将对称矩阵转换为压缩矩阵
                    _a[i*(i + 1) / 2+j] = a[i*size+j];
                }
                
            }
        }
    }
//压缩矩阵的访问打印
    void Print(size_t size)
    {
        for (int i = 0; i < size; i++)
        {
            for (int j = 0; j < size; j++)
            {
                int row = i;
                int col = j;
                if (row < col)
                {
                    swap(row, col);
                }
                cout << _a[row*(row + 1)/2 + col] << " ";
            
            }
            cout << endl;
        }
        cout << endl;
    }

private:
    T* _a;
    size_t _size;    //即n,对称矩阵为方阵
};

void Test()
{
    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 }, 
                  };

    SymmtrixMatrix<int> sm((int*)a, 5);
    sm.Print(5);
    
}

int main()
{
    Test();
    system("pause");
    return 0;
}
时间: 2024-08-03 13:26:14

【数据结构】对称矩阵及对称矩阵的压缩存储的相关文章

对称矩阵、稀疏矩阵的压缩存储

1)对称矩阵的压缩存储 对称矩阵顾名思义就是符合行和列的个数相同,并且矩阵中存储的数据上三角和下三角中对应位置上的元素值是相等的.为了能够减少存储的空间,我们可以只存储上三角矩阵.或者下三角矩阵中的元素,这样就能够极大地节省空间的浪费.下面是对称矩阵的示列: 假设对称矩阵为n*n,这里以行优先存储下三角矩阵,总共需要存储的元素有n*(n+1)/2个元素,从而将n*n个元素压缩到n*(n+1)/2大小的空间中. 下面是具体的程序实现: --symmetric.h文件 //实现对称矩阵 #inclu

数据结构实践——压缩存储的对称矩阵的运算

本文针对数据结构基础系列网络课程(5):数组与广义表的实践项目. [项目 - 压缩存储的对称矩阵的运算] 设计算法,实现两个用压缩形式存储的对称矩阵A和B的加法和乘法.实现中请使用好前面设计的基本运算. [参考解答] #include <stdio.h> #define N 4 #define M 10 int value(int a[],int i,int j) { if (i>=j) return a[(i*(i+1))/2+j]; else return a[(j*(j+1))/2

c++对称矩阵的压缩存储

对称矩阵 对称矩阵及对称矩阵的压缩存储 设一个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

对称矩阵及对称矩阵的压缩存储

    若设一个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

矩阵-----对称矩阵及其压缩存储&&稀疏矩阵

什么是对称矩阵(SymmetricMatrix)? 对称对称-------看 设一个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]

对称矩阵 压缩存储

对称矩阵及对称矩阵的压缩存储 设一个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] #

对称矩阵的压缩存储和输出

矩阵我个人理解就是一堆数据放在一块儿排列整齐,当然正规一点说就是m行n列的数据构成.在编程中一般采用数组对其进行存储,但矩阵中的某些特殊矩阵里,有时会出现很多数据相等或者存有很多0只有某几个位置为别的数据,那么这类矩阵我们在用数组存储的时候就会感觉比较的浪费空间,那么会对一些特殊矩阵进行压缩存储. 常见的能够压缩存储的矩阵有对称矩阵和稀疏矩阵,今天主要说说对称矩阵的压缩存储.先来说说什么是对称矩阵,相信大家都很熟悉,对于一个矩阵如果它的行和列相等并且矩阵中的数据是关于对角线对称的,那么我们称这样

C++实现对称矩阵的压缩存储

#include <iostream> using namespace std; /*对称矩阵及对称矩阵的压缩存储*/ template<class T> class SymmetricMatrix { public: SymmetricMatrix(T* a, size_t N) :_a(new T[N*(N+1)/2]) ,_n(N) { size_t index = 0; for (size_t i = 0; i < N; ++i) { for (size_t j = 

对称矩阵及稀疏矩阵的压缩

对称矩阵 设一个N*N的方阵A,A中的任意元素A[i][j],当且仅当A[i][j]=A[j][i],则矩阵A是对称矩阵,以对角线分隔,分为上三角和下三角 压缩矩阵存储对称矩阵时只需要存储其上三角或者下三角的数据,即最多存储n(n+1)/2个数据,对应关于为:i>j,symmetricMatrix[i][j]=A[i*(i+1)/2+j] 代码实现: template<class T> class SymmetricMatrix { public: SymmetricMatrix(T*a