对称矩阵的压缩储存讲解

 更新时间:2019年02月20日 15:28:14   作者:gogogo_sky  
今天小编就为大家分享一篇关于对称矩阵的压缩储存讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

一、存储矩阵用一个二维数组即可;

二、什么是对称矩阵:

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

三、对称矩阵的压缩储存:

压缩存储称矩阵存储时只需要存储上三角/下三角的数据,所以最多存储n(n+1)/2个数据(相当于1+2+…+n,即等差数列求和)。

对称矩阵和压缩存储的对应关系:下三角存储i>=j, SymmetricMatrix[i][j] ==Array[i*(i+1)/2+j]

四、代码实现

#include<iostream>
using namespace std;
template<class T>
class CompressionMatrix
{
public:
  CompressionMatrix(T* arr,int sz)
    :_data(new T[sz*(sz+1)/2])
    ,_size(sz)
  {
    int index=0;
    //压缩储存过程
    for(int i=0;i<sz;++i)
    {
      for(int j=0;j<sz;++j)
      {
        if (i>=j)//_data中储存下三角的数据
        {
          _data[index]=arr[i*sz+j];
          index++;
        }
        else
          break;
      }
    }
  }
  //获取某个坐标的数据,i和j代表该数据在矩阵中的横纵坐标
  T GetDate(int i,int j)
  {
    if (i>=j)//下三角数据
    {
      return _data[i*(i+1)/2+j];
    }
    else//上三角数据
    {
      std::swap(i,j);//将横坐标和从坐标值交换;
      return _data[i*(i+1)/2+j];
    }
  }
    //打印矩阵的数据
  void PrintfMatrix()
  {
    for (int i=0;i<_size;++i)
    {
      for (int j=0;j<_size;++j)
      {
        cout<<GetDate(i,j)<<" ";
      }
      cout<<endl;
    }
  }
  ~CompressionMatrix()
  {
    if (_data!=NULL)
    {
      delete[] _data;
      _data=NULL;
      _size=0;
    }
  }
protected:
  T* _data;//储存数据的数组
  int _size;//储存原始对称矩阵的行数(或列数)
};

测试代码:

int main()
{
  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},
  };
  CompressionMatrix<int> cm((int*)a,5);//将二维数组强制转换为一维数组指针,是问题更简单
  cm.PrintfMatrix();
  return 0;
}

五、运行结果

O(∩_∩)O

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

相关文章

  • C语言实现Fibonacci数列递归

    C语言实现Fibonacci数列递归

    这篇文章主要介绍了C语言实现Fibonacci数列递归,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • C语言文件操作中 fgets与fputs 函数详解

    C语言文件操作中 fgets与fputs 函数详解

    这篇文章主要介绍了C语言文件操作中 fgets与fputs 函数详解的相关资料,需要的朋友可以参考下
    2017-06-06
  • c语言printf实现同一位置打印输出的实例

    c语言printf实现同一位置打印输出的实例

    下面小编就为大家带来一篇c语言printf实现同一位置打印输出的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • C语言多文件编程问题解析

    C语言多文件编程问题解析

    在某些场景中,考虑到编译效率和可移植性,#pragma once 和 #ifndef 经常被结合使用来避免头文件被 重复引入,这里介绍用 _Pragma 操作符避免头文件重复引入的问题,感兴趣的朋友跟随小编一起看看吧
    2022-12-12
  • 详细解析命令行的getopt_long()函数

    详细解析命令行的getopt_long()函数

    getopt_long支持长选项的命令行解析,函数中的参数argc和argv通常直接从main()的两个参数传递而来
    2013-09-09
  • C++ 中CListCtrl的每个项都显示不同的提示信息

    C++ 中CListCtrl的每个项都显示不同的提示信息

    这篇文章主要介绍了C++ 中CListCtrl的每个项都显示不同的提示信息的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-09-09
  • C++编写LINUX守护进程的实现代码

    C++编写LINUX守护进程的实现代码

    这篇文章主要介绍了如何使用C++实现LINUX守护进程,文中代码非常详细,供大家学习参考,感兴趣的小伙伴可以了解下
    2020-06-06
  • 关于C++一些特性的探究

    关于C++一些特性的探究

    下面小编就为大家带来一篇关于C++一些特性的探究。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • C++继承模式详解

    C++继承模式详解

    继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有的特性基础上进行扩展,增加功能,这样产生新的类,称作是派生类。继承呈现了面向对象程序设计的层析结构,体现了由简单到复杂的认知过程。继承是类设计层次的复用。
    2021-12-12
  • C语言的预处理介绍

    C语言的预处理介绍

    大家好,本篇文章主要讲的是C语言的预处理介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12

最新评论