稀疏矩阵

 /*
思路:将稀疏矩阵a转置为b,先扫描一遍a三元表(行列值),
获得a各列元素个数->得到b各行元素个数->知道a各元素在b中的插入位置->再扫描一遍a即可
T(n)=O(Cols+Terms);
*/
1
const int MaxTerms = 100; 2 class SparseMatrix 3 {public: 4 SparseMatrix FastTranspose(); 5 SparseMatrix Add(SparseMatrix b); 6 SparseMatrix Multiply(SparseMatrix b); 7 private: 8 int Rows, Cols, Terms;//矩阵的行数 列数 非零项数 9 MatrixTerm smArray[MaxTerms]; 10 }; 11 class MatrixTerm 12 { 13 friend SparseMatrix; 14 private: 15 int row, col, value;//非零项的位置和值。三元表行优先 16 }; 17 //稀疏矩阵快速转置 18 SparseMatrix SparseMatrix::FastTranspose()//将矩阵a(自身)转置为b 19 { 20 int* RowSize = new int[Cols];//下标为行 21 int* RowStart = new int[Cols]; 22 SparseMatrix b; 23 b.Rows = Cols;b.Cols = Rows;b.Terms = Terms; 24 if (Terms > 0) 25 { 26 for (int i = 0;i < Cols;++i) 27 RowSize[i] = 0; 28 for (int i = 0;i < Cols;++i) 29 RowSize[smArray[i].Cols]++; 30 RowStart[0] = 0; 31 for (int i = 1;i < Cols;++i) 32 RowStart[i] = RowStart[i - 1] + RowSize[i - 1];//RowStart目前存放矩阵b各行元素起始位置 33 for (int i = 1;i < Terms;++i) 34 { 35 int j = RowStart[smArray[i].col];//smArray[i]在b三元表中的位置j 36 b.smArray[j].row = smArray[i].col; 37 b.smArray[j].col= smArray[i].row; 38 b.smArray[j].value = smArray[i].value; 39 RowStart[smArray[i].col]++;//RowStart存放本行下一个元素进来的位置 40 }; 41 }; 42 delete[]RowSize; delete[] RowStart; 43 return b; 44 };

 

posted @ 2020-10-26 21:22  __小王子  阅读(134)  评论(0)    收藏  举报