C++ 数据结构之对称矩阵及稀疏矩阵的压缩存储

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

1.稀疏矩阵

 对于那些零元素数目远远多于非零元素数目,并且非零元素的分布没有规律的矩阵称为稀疏矩阵(sparse)。

  人们无法给出稀疏矩阵的确切定义,一般都只是凭个人的直觉来理解这个概念,即矩阵中非零元素的个数远远小于矩阵元素的总数,并且非零元素没有分布规律。

实现代码:

//稀疏矩阵及其压缩存储
#pragma once 

#include <vector>
#include <iostream>
using namespace std; 

template<class T>
struct Triple
{
 size_t _r;
 size_t _c;
 T _value; 

 Triple(size_t row = 0, size_t col = 0, const T& value = T())
  :_r(row)
  ,_c(col)
  ,_value(value)
 {}
}; 

template <class T>
class SparseMatrix
{
public:
 SparseMatrix()
 :_row(0)
  ,_col(0)
  ,_illegal(T())
 {} 

 SparseMatrix(T* arr, size_t row, size_t col, const T& illegal)
  :_row(row)
  ,_col(col)
  ,_illegal(illegal)
 {
  for(size_t i = 0; i<row; ++i)
  {
   for(size_t j = 0; j<col; ++j)
   {
    if(arr[i*col+j] != illegal)
    {
     Triple<T> t(i,j,arr[i*col+j]);
     _matrix.push_back(t);
    }
   }
  }
 } 

 void Display()
 { 

  vector<Triple<T> >::iterator iter;
  iter = _matrix.begin();
  for(size_t i = 0; i<_row; ++i)
  {
   for(size_t j = 0; j<_col; ++j)
   {
    if(iter!=_matrix.end()
     &&iter->_r == i
     &&iter->_c == j)
    {
     cout << iter->_value <<" ";
     ++iter;
    }
    else
    {
     cout << _illegal <<" ";
    }
   }
   cout << endl;
  }
 cout << endl;
 }
 //普通转置(行优先存储)
 //列变行,从0列开始,将列数据一个一个放进转置矩阵
 SparseMatrix<T> Transpose()
 {
  SparseMatrix<T> tm;
  tm._row = _col;
  tm._col = _row;
  tm._illegal = _illegal;
  tm._matrix.reserve(_matrix.size()); 

  for(size_t i = 0; i<_col; ++i)
  {
   size_t index = 0;
   while(index < _matrix.size())
   {
    if(_matrix[index]._c == i)
    {
     Triple<T> t(_matrix[index]._c, _matrix[index]._r, _matrix[index]._value);
     tm._matrix.push_back(t);
    }
    ++index;
   }
  }
  return tm;
 } 

 SparseMatrix<T> FastTranspose()
 {
  SparseMatrix<T> tm;
  tm._row = _col;
  tm._col = _row;
  tm._illegal = _illegal;
  tm._matrix.resize(_matrix.size()); 

  int* count = new int[_col];//记录每行的元素个数
  memset(count, 0, sizeof(int)*_col);
  int* start = new int[_col];//转置矩阵中元素的位置
  start[0] = 0; 

  size_t index = 0;
  while(index < _matrix.size())
  {
   count[_matrix[index]._c]++;
   ++index;
  } 

  for(size_t i=1; i<_col; ++i)
  {
   start[i] = start[i-1] + count[i-1];
  } 

  index = 0;
  while(index < _matrix.size())
  {
   Triple<T> t(_matrix[index]._c, _matrix[index]._r, _matrix[index]._value);
   tm._matrix[start[_matrix[index]._c]++] = t; //核心代码
   ++index;
  } 

  delete[] count;
  delete[] start;
  return tm;
 }
protected:
 vector<Triple<T> > _matrix;
 size_t _row;
 size_t _col;
 T _illegal;
};

2.对称矩阵

实现代码:

//对称矩阵及其压缩存储 

#pragma once
#include <iostream>
using namespace std; 

template <class T>
class SymmetricMatrix
{
public:
 SymmetricMatrix(T* arr, size_t n)
  :_n(n)
  ,_matrix(new T[n*(n+1)/2])
 {
  size_t index = 0;
  for(size_t i = 0; i<n; ++i)
  {
   for(size_t j=0; j<n;++j)
   {
    if(i >= j)
    {
     _matrix[index] = arr[i*n+j];
     ++index;
    }
    else
    {
     continue;
    }
   }
  }
 }
 void Display()
 {
  for(size_t i =0; i < _n; ++i)
  {
   for(size_t j = 0; j < _n; ++j)
   {
   /* if(i<j)
    {
     swap(i,j);
     cout<<_matrix[i*(i+1)/2+j]<<" ";
     swap(i,j);
    }
    else
     cout<<_matrix[i*(i+1)/2+j]<<" ";
   */
    cout << Access(i,j) << " ";
   }
   cout << endl;
  }
  cout << endl;
 } 

 T& Access(size_t row, size_t col)
 {
  if(row<col)
  {
   swap(row, col);
  }
  return _matrix[row*(row+1)/2+col];
 }
 ~SymmetricMatrix()
 {
  if(_matrix != NULL)
  {
   delete[] _matrix;
   _matrix = NULL;
  }
 }
protected:
 T* _matrix;
 size_t _n; //对称矩阵的行列大小
};

以上就是C++ 数据结构实现稀疏矩阵与对称矩阵,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • 数据结构之矩阵行列和相等的实例

    以下为展示"矩阵行列和相等"的简单示例: 1.用c语言实现的版本 #include <stdio.h> #include <math.h> void main() { int a[16][16],i,j,n,k; printf("Please input n(1~15,it must be odd.): "); scanf("%d",&n); while(!(n>=1&&n<=15) |

  • C++ 数据结构之对称矩阵及稀疏矩阵的压缩存储

    对称矩阵及稀疏矩阵的压缩存储 1.稀疏矩阵 对于那些零元素数目远远多于非零元素数目,并且非零元素的分布没有规律的矩阵称为稀疏矩阵(sparse). 人们无法给出稀疏矩阵的确切定义,一般都只是凭个人的直觉来理解这个概念,即矩阵中非零元素的个数远远小于矩阵元素的总数,并且非零元素没有分布规律. 实现代码: //稀疏矩阵及其压缩存储 #pragma once #include <vector> #include <iostream> using namespace std; templa

  • C++实现稀疏矩阵的压缩存储实例

    什么是稀疏矩阵呢,就是在M*N的矩阵中,有效值的个数远小于无效值的个数,并且这些数据的分布没有规律.在压缩存储稀疏矩阵的时候我们只存储极少数的有效数据.我们在这里使用三元组存储每一个有效数据,三元组按原矩阵中的位置,以行优先级先后次序依次存放.下面我们来看一下代码实现. #include<iostream> #include<vector> #include<assert.h> using namespace std; template<class T> c

  • C++ 实现稀疏矩阵的压缩存储的实例

    C++ 实现稀疏矩阵的压缩存储的实例 稀疏矩阵:M*N的矩阵,矩阵中有效值的个数远小于无效值的个数,且这些数据的分布没有规律. 稀疏矩阵的压缩存储:压缩存储值存储极少数的有效数据.使用{row,col,value}三元组存储每一个有效数据,三元组按原矩阵中的位置,以行优先级先后顺序依次存放. 实现代码: #include <iostream> #include <vector> using namespace std; template<class T> struct

  • java实现稀疏矩阵的压缩与解压的方法

    目录 任务要求 思路分析 稀疏矩阵的压缩 稀疏矩阵的解压 代码实现 任务要求 把棋盘当作一个稀疏矩阵,0表示没棋,1表示黑棋,2表示蓝棋. 把该稀疏矩阵压缩以三元组形式表示并以文件形式保存,再写另一个程序读取文件中的信息把压缩后的三元组还原成原来的稀疏矩阵. 其中三元组的第一行用来存储原始稀疏矩阵的行数.列数和有效的数据个数,其余行用来存储有效的非0数据 思路分析 稀疏矩阵的压缩 遍历原始的稀疏矩阵,得到有效的数据个数sum 根据sum创建三元组new int [sum+1] [3](即sum+

  • C语言数组学习之特殊矩阵的压缩存储

    目录 1.数组的定义 数组与线性表的关系 2.数组的存储结构 习题1 3.对称矩阵 概念 存储方法选择 习题1 习题2 4.三角矩阵 概念 存储方法选择 5.三对角矩阵 概念 存储方法选择 习题1 6.稀疏矩阵 概念 存储方法选择 首先最开始我们先回忆一下数组的概念 1.数组的定义 数组是由n个相同类型的数据元素构成的有限序列,每个数据元素称为一个数组元素,每个元素在n个线性关系中的序号称为该元素的下标,下标的取值范围称为数组的维界. 数组与线性表的关系 数组是线性表的推广 一维数组可以视为一个

  • C++实现特殊矩阵的压缩存储算法

    目录 1. 前言 2. 压缩对称矩阵 3. 压缩稀疏矩阵 3.1 三元组表 3.2 以列优先搜索 3.3 找出存储位置 4. 总结 1. 前言 什么是特殊矩阵? C++,一般使用二维数组存储矩阵数据. 在实际存储时,会发现矩阵中有许多值相同的数据或有许多零数据,且分布呈现出一定的规律,称这类型的矩阵为特殊矩阵. 为了节省存储空间,可以设计算法,对这类特殊矩阵进行压缩存储,让多个相同的非零数据只分配一个存储空间:对零数据不分配空间. 本文将讲解如何压缩这类特殊矩阵,以及压缩后如何保证矩阵的常规操作

  • C语言数据结构之线性表的链式存储结构

    1.什么是线性表的链式存储结构 -链表 存储结点:包括元素本身的信息,还有元素之间的关系逻辑的信息 这个结点有:数据域和指针域 一个指针域:指向后继结点, 单链表 二个指针域: 指向前继结点,还有一个指向后继结点 双链表 2.原理是: s=(LinkNode *)malloc(sizeof(LinkNode));// s->data=e; //这里赋值了 s->next=p->next; // p->next=s; //这里把指针s给到了p 结点a-> 结点b -> 结

  • Java数据结构之稀疏矩阵定义与用法示例

    本文实例讲述了Java数据结构之稀疏矩阵定义与用法.分享给大家供大家参考,具体如下: 稀疏矩阵非零元素的三元组类: package com.clarck.datastructure.matrix; /** * 稀疏矩阵的压缩存储 * * 稀疏矩阵非零元素的三元组类 * * @author clarck * */ public class Triple implements Comparable<Triple> { // 行号,列号, 元素值,默认访问权限 int row, colum, val

  • Python稀疏矩阵scipy.sparse包使用详解

    目录 1. 前言 2. 导入包 3. 稀疏矩阵总览 4. 稀疏矩阵详细介绍 4.1 coo_matrix 4.2 dok_matrix 4.3 lil_matrix 4.4 dia_matrix 4.5 csc_matrix & csr_matrix 4.6 bsr_matrix 5. 稀疏矩阵的存取 5.1 用save_npz保存单个稀疏矩阵 6. 总结 7. 参考 1. 前言 数组和矩阵是数值计算的基础元素.目前为止,我们都是使用NumPy的ndarray数据结构来表示数组,这是一种同构的容

  • 对称矩阵的压缩储存讲解

    一.存储矩阵用一个二维数组即可: 二.什么是对称矩阵: 设一个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, S

随机推荐