![]()
/*
思路:将稀疏矩阵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 };