对称矩阵、稀疏矩阵
来源:互联网 发布:单片机以太网通信 编辑:程序博客网 时间:2024/05/10 10:58
#pragma once#include <vector>// 对称矩阵存储template<class T>class SymmetricMatrix{public:SymmetricMatrix(T* a, size_t size):_a(new T[size*(size+1)/2]),_size(size*(size+1)/2){assert(a);size_t index = 0;for (size_t i = 0; i < size; ++i){for (size_t j = 0; j < size; ++j){if (i >= j){_a[index++] = a[i*size+j]; }else{break;}}}}T& Access(size_t i, size_t j){if (i < j){swap(i, j);}return _a[i*(i+1)/2+j];}protected:T* _a;size_t _size;};void TestSymmetricMatrix(){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},};SymmetricMatrix<int> sm((int*)a, 5);}// 三元组template<class T>struct Trituple{int _row;// 行int _col;// 列T_value; // 数据Trituple(int row = 0, int col = 0, const T& value = 0):_row(row),_col(col),_value(value){}};//// 稀疏矩阵// 定长的静态存储// 动态存储//template<class T>class SparseMatrix{public:SparseMatrix(T* ar = 0, int row = 0, int col = 0, const T& invalid = 0):_rowSize(row),_colSize(col),_invalid(invalid){for(int i = 0; i < row; ++i){for (int j = 0; j < col; ++j){if (ar[i * col + j] != invalid){_matrixs.push_back(Trituple<T>(i, j, ar[i * col + j]));}}}}~SparseMatrix(){}void Display(){size_t index = 0;for (int i = 0; i < _rowSize; ++i){for (int j = 0; j < _colSize; ++j){if (index < _matrixs.size()&& _matrixs[index]._row == i && _matrixs[index]._col == j){cout<<" "<<_matrixs[index]._value;++index;}else{cout<<" "<<_invalid;}}cout<<endl;}cout<<endl;}// 矩阵转置SparseMatrix<T> Transpose(){SparseMatrix<T> sm;sm._rowSize = _colSize;sm._colSize = _rowSize;sm._invalid = _invalid;for (int i = 0; i < _colSize; ++i){size_t index = 0;while (index < _matrixs.size()) {if (_matrixs[index]._col == i){sm._matrixs.push_back(Trituple<T>());sm._matrixs.back()._row = i;sm._matrixs.back()._col = _matrixs[index]._row;sm._matrixs.back()._value = _matrixs[index]._value;}++index;}}return sm;}// 矩阵转置SparseMatrix<T> FastTranspose(){SparseMatrix<T> sm;sm._rowSize = _colSize;sm._colSize = _rowSize;sm._invalid = _invalid;for (size_t i = 0; i < _matrixs.size(); ++i){sm._matrixs.push_back(Trituple<T>());}int* rowCounts = new int[_colSize];int* rowStart = new int[_colSize];memset(rowCounts, 0, sizeof(int)*_colSize);memset(rowStart, 0, sizeof(int)*_colSize);// 统计转置后矩阵每一行的数据个数for (size_t i = 0; i < _matrixs.size(); ++i){rowCounts[_matrixs[i]._col]++;}// 统计转置后的矩阵每行在压缩矩阵中存储的开始位置rowStart[0] = 0;for (int i = 1; i < _colSize; ++i){rowStart[i] = rowStart[i - 1] + rowCounts[i - 1];}for (size_t i = 0; i < _matrixs.size(); ++i){size_t index = rowStart[_matrixs[i]._col];sm._matrixs[index]._col = _matrixs[i]._row;sm._matrixs[index]._row = _matrixs[i]._col;sm._matrixs[index]._value = _matrixs[i]._value;++(rowStart[_matrixs[i]._col]);}delete[] rowCounts;delete[] rowStart;return sm;}private:vector<Trituple<T> > _matrixs;int _rowSize;// 行int _colSize;// 列T _invalid;// 无效值};void Test1(){int array[6][5] = {{1, 0, 3, 0, 5}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {1, 0, 3, 0, 5}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}};SparseMatrix<int> sm((int*)array, 6, 5, 0);sm.Display();SparseMatrix<int> ret1 = sm.Transpose();ret1.Display();SparseMatrix<int> ret2 = sm.FastTranspose();ret2.Display();}
0 0
- 对称矩阵、稀疏矩阵
- 【数据结构】稀疏矩阵,对称矩阵
- 对称与稀疏矩阵
- 对称矩阵、稀疏矩阵的压缩存储
- 对称矩阵&稀疏矩阵的两种转置算法
- 对称矩阵与稀疏矩阵(转置)
- 对称矩阵及稀疏矩阵浅谈
- 矩阵-----对称矩阵及其压缩存储&&稀疏矩阵
- 【矩阵】对称矩阵及稀疏矩阵的压缩存储
- matlab 生成 稀疏 对称正定 矩阵
- 关于对称矩阵和稀疏矩阵问题的探究
- 稀疏矩阵的对称矩阵的转置
- 对称矩阵和稀疏矩阵的压缩和转置
- 对称矩阵和稀疏矩阵以及它们的压缩存储
- 【数据结构】对称矩阵和稀疏矩阵的压缩存储
- 对称矩阵和稀疏矩阵的相关问题
- 稀疏矩阵
- 稀疏矩阵
- 采用CSS3通配符实现高效修改
- Android中VideoView的简单使用
- java代码重构
- machine learning之logistic regression
- 深度学习第二天: 基础理论.md
- 对称矩阵、稀疏矩阵
- 宏定义中if语句的用法
- Linux 守护进程的实现
- 求2+22+222+2222+.....的N项之和
- RecyclerView notifyItemChanged 后 item 闪动
- JAVA通过调用数据库函数调用存储过程
- 深度学习第三天: LeNet在Python实现Mnist手写数字.md
- 用setx设置永久环境变量及注意事项
- C#控制台基础 向arraylist中添加数组或者arraylist要用addrange方法