Chinaunix首页 | 论坛 | 博客
  • 博客访问: 261189
  • 博文数量: 84
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 927
  • 用 户 组: 普通用户
  • 注册时间: 2015-03-06 23:00
个人简介

growing

文章分类

全部博文(84)

文章存档

2017年(6)

2016年(61)

2015年(17)

我的朋友

分类: C/C++

2016-03-14 12:07:06

1.压缩矩阵(对称矩阵)

  1. template<class T>
  2. class SymmetricMatrix
  3. {
  4. public:
  5.     SymmetricMatrix(T * a,const size_t n)
  6.         :_array(new T[n*(n + 1)/2])
  7.         ,_n(n)
  8.     {
  9.         size_t index = 0;
  10.         for(int i = 0;i < n;++i)
  11.         {
  12.             for(int j = 0;i < n;++j)
  13.             {
  14.                 if(i >= j)
  15.                 {
  16.                  _array[index++] = a[i*_n + j];
  17.                 }
  18.                 else
  19.                 {
  20.                     break;
  21.                 }
  22.             }
  23.         }
  24.     }
  25.     void Print()
  26.     {
  27.         for(size_t i = 0;i < _n;++i)
  28.         {
  29.             for(size_t j = 0;j < _n;++j)
  30.             {
  31.                 if(i >= j)
  32.                 {
  33.                     cout<<_array[i*(i + 1)/2 + j]<<" ";
  34.                 }
  35.                 else
  36.                 {
  37.                     cout<<_array[j*(j + 1)/2 + i]<<" ";
  38.                 }
  39.             }
  40.             cout<<endl;
  41.         }
  42.         cout<<endl;
  43.     }
  44.     ~SymmetricMatrix()
  45.     {
  46.         delete [] _array;
  47.     }
  48. private:
  49.     T *_array;
  50.     size_t _n;
  51. };

  52. void test()
  53. {
  54.     int arr[3][3] = { { 0, 1, 2 },{ 1, 0, 1 },{ 2, 1, 0 } };
  55.     SymmetricMatrix<int> sm((int *)arr,3);
  56.  
  57.      sm.Print();
  58. }
2.稀疏矩阵

  1. #pragma once
  2. #include <vector>

  3. template<class T>
  4. class Trituple
  5. {
  6. public:
  7.     Trituple()
  8.     {}
  9.     Trituple(int row,int col,T& n)
  10.         :_row(row)
  11.         ,_col(col)
  12.         ,_value(n)
  13.     {}
  14.     int _row;
  15.     int _col;
  16.     T _value;
  17. };

  18. template<class T>
  19. class SparseMatrix//稀疏矩阵
  20. {
  21. public:
  22.     SparseMatrix()
  23.     {}
  24.      SparseMatrix(T*a,const int m,const int n,T & invalid)
  25.          :_rowSize(m)
  26.          ,_colSize(n)
  27.          ,_invalid(invalid)
  28.      {
  29.          size_t index = 0;
  30.          for(size_t i = 0;i < _rowSize; ++i)
  31.          {
  32.              for(size_t j = 0;j < _colSize ; ++j)
  33.              {
  34.                 if(a[i*_colSize+j] != _invalid)
  35.                 {
  36.                     Trituple<T> t(i,j,a[i*_colSize+j]);
  37.                     _array.push_back(t);
  38.                 }
  39.              }
  40.          }
  41.      }
  42.      void Print()
  43.      {
  44.          size_t index = 0;
  45.          for(size_t i = 0;i < _rowSize; ++i)
  46.          {
  47.              for(size_t j = 0;j < _colSize ; ++j)
  48.              {
  49.                  if(index<_array.size() && i == _array[index]._row && j == _array[index]._col)
  50.                  {
  51.                      cout<<_array[index++]._value<<" ";
  52.                  }
  53.                  else
  54.                  {
  55.                      cout<<_invalid<<" ";
  56.                  }
  57.              }
  58.              cout<<endl;
  59.          }
  60.      cout<<endl;
  61.      }
  62.      SparseMatrix<T> Transpose()
  63.      {
  64.         SparseMatrix<T> sm;
  65.         sm._colSize = _rowSize;
  66.         sm._rowSize = _colSize;
  67.         sm._invalid = _invalid;
  68.         for (int j = 0; j < _colSize; ++j)
  69.         {
  70.             int i = 0;
  71.             while ( i < _array.size())
  72.             {
  73.                 if(_array[i]._col == j)
  74.                 {
  75.                     Trituple<T> t(_array[i]._col, _array[i]._row,_array[i]._value);
  76.                     sm._array.push_back(t);
  77.                 }
  78.                 ++i;
  79.             }
  80.             
  81.         }
  82.         return sm;
  83.      }
  84.      SparseMatrix<T> FastTranspose()
  85.      {
  86.         SparseMatrix<T> sm;
  87.         sm._colSize = _rowSize;
  88.         sm._rowSize = _colSize;
  89.         sm._invalid = _invalid;
  90.         sm._array.resize(_array.size());

  91.         int *RowCount = new int[_colSize];
  92.         int *RowStart = new int[_colSize];
  93.         memset(RowCount,0,sizeof(int)*_colSize);
  94.         memset(RowStart,0,sizeof(int)*_colSize);

  95.         int i = 0;
  96.         while(i < _array.size())
  97.         {
  98.             ++RowCount[_array[i++]._col];
  99.         }
  100.         i = 1;
  101.         while (i < _colSize) //O(n)
  102.         {
  103.             RowStart[i] = RowStart[i - 1] + RowCount[i - 1];
  104.             ++i;
  105.         }

  106.         //执行快速转置
  107.         int index = 0;
  108.         while (index < _array.size()) //两次迭代 O(n)
  109.         {

  110.             Trituple<T> t(_array[index]._col, _array[index]._row,_array[index]._value);
  111.             sm._array[RowStart[_array[index]._col]++] = t;
  112.             ++index;
  113.         }



  114.         delete[] RowCount;
  115.         delete[] RowStart;

  116.         return sm;
  117.      }

  118.      ~SparseMatrix()
  119.      {
  120.          _array.clear();
  121.      }
  122. private:
  123.     vector<Trituple<T>> _array;
  124.     size_t _rowSize;
  125.     size_t _colSize;
  126.     T _invalid;
  127. };
  128. void test2()
    {
     int arr[4][3] = { { 0, 1, 0},{ 0, 0, 0 },{ 2, 1, 0 },{3,3,2}};
     int i = 0;
     SparseMatrix sm((int *)arr,4,3,i);

     sm.Print();

     sm.Transpose().Print();
     sm.FastTranspose().Print();

    }
RowCount 转置后每一行有效值的个数,RowCount转置后每一行有效值在压缩矩阵开始的位置

此图关于RowCount是怎么存进去的,最开始全部memset成0了,然后遍历有效数组并把每个数加好就好了
阅读(1138) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~