【数据结构】稀疏结构及稀疏矩阵的压缩存储,矩阵的转置

前端之家收集整理的这篇文章主要介绍了【数据结构】稀疏结构及稀疏矩阵的压缩存储,矩阵的转置前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

在矩阵中,有一类很重要的矩阵,就是-----稀疏矩阵。


所谓的稀疏矩阵呢,就是指的是,在矩阵中,有效的数据个数远远小于无效的数据个数(并且这些数据排列顺序没有规律)。我们下面先举个稀疏矩阵的例子:

wKiom1cNoXqgYIYUAAAPLNUT7Mw525.png

有效数据个数仅仅6个,其余都为无效数据0.


那我们将稀疏矩阵存在压缩矩阵中,设定一个三元组,使用{row,col,value}存储每一个有效数据,三元组按原矩阵中的位置,以行优先级先后顺序依次存放。

我们建立一个结构体:

  1. structTriple//定义一个三元组,用来存储稀疏矩阵的x,y,坐标值
  2. {
  3. int_row;
  4. int_col;
  5. T_value;
  6. };

将每一个有效数据(三元组)存在顺序表vector中,打印数据就按照顺序表的特点打印。

矩阵的转置:


wKiom1cNoyLgdIoCAAAda7pd8GI613.png

所以,转置就是将原矩阵的行、列对换,也就是将[i][j]和[j][i]位置上的数据对换。


代码如下:


  1. #include<vector>
  2.  
  3. template<classT>
  4. structTriple//定义一个三元组,用来存储稀疏矩阵的x,坐标值
  5. {
  6. int_row;
  7. int_col;
  8. T_value;
  9.  
  10. Triple(introw,intcol,intvalue)
  11. :_row(row),_col(col),_value(value)
  12. {}
  13. };
  14.  
  15.  
  16.  
  17. template<classT>
  18. classSparseMatrix
  19. {
  20. public:
  21. SparseMatrix(T*a,intm,intn,constT&invalid)
  22.  
  23. {
  24. for(inti=0;i<m;i++)
  25. {
  26. for(intj=0;j<n;j++)
  27. {
  28. if(invalid!=a[i*n+j])
  29. {
  30. //将每一个有效数据(三元组)存在顺序表vector中
  31. Triple<T>tmp(i,j,a[i*n+j]);
  32.  
  33. _a.push_back(tmp);
  34. }
  35.  
  36. }
  37. }
  38. }
  39.  
  40.  
  41. //用坐标形式打印稀疏矩阵
  42. voidDisplay(intm,constT&invalid)
  43. {
  44. cout<<"用坐标形式打印稀疏矩阵"<<endl;
  45. cout<<"{"<<"x,"<<""<<"y,"<<""<<"value"<<"}"<<endl;
  46. for(intk=0;k<_a.size();k++)
  47. {
  48.  
  49. cout<<"{"<<_a[k]._row<<","<<
  50. _a[k]._col<<","<<_a[k]._value<<""<<
  51. "}"<<endl;
  52. }
  53. }
  54.  
  55. //用矩阵形式打印稀疏矩阵
  56. voidDisplayMatrix(intm,constT&invalid)
  57. {
  58. cout<<"用矩阵形式打印稀疏矩阵"<<endl;
  59. intk=0;
  60. for(inti=0;i<m;i++)
  61. {
  62. for(intj=0;j<n;j++)
  63. {
  64.  
  65. if(k<_a.size()&&_a[k]._row==i&&_a[k]._col==j)
  66. {
  67. cout<<_a[k]._value<<"";
  68. k++;
  69. }
  70. else
  71. {
  72. cout<<invalid<<"";
  73. }
  74. }
  75. cout<<endl;
  76. }
  77. }
  78.  
  79. //矩阵转置
  80. SparseMatrix<T>Transport(T*a,constT&invalid)
  81. {
  82. cout<<"矩阵转置:"<<endl;
  83. intb[5][6];//行列互换大小
  84. for(inti=0;i<m;i++)//行列互换大小
  85. {
  86. for(intj=0;j<n;j++)
  87. {
  88. //将一维数组形式的元素转换为[j][i]形式
  89. b[j][i]=a[i*n+j];
  90. }
  91. }
  92.  
  93. SparseMatrix<T>TranMatrix((int*)b,5,6,0);
  94. returnTranMatrix;
  95. }
  96.  
  97. protected:
  98. vector<Triple<T>>_a;
  99.  
  100. };
  101.  
  102.  
  103.  
  104. voidTest()
  105. {
  106.  
  107. inta[6][5]={
  108. {1,3,5},{0,0},{2,4,6},};
  109.  
  110. intm=6;
  111. intn=5;
  112. SparseMatrix<int>sm((int*)a,m,n,0);
  113. sm.Display(m,0);
  114. sm.DisplayMatrix(m,0);
  115. SparseMatrix<int>sm1((int*)a,0);
  116. sm1=sm.Transport((int*)a,0);
  117.  
  118.  
  119. sm1.Display(n,0);
  120. sm1.DisplayMatrix(n,0);
  121. }
  122.  
  123. intmain()
  124. {
  125. Test();
  126. system("pause");
  127. return0;
  128. }

猜你在找的数据结构相关文章