设矩阵A中有s个非零元素。令e=s/(mXn), 称e为矩阵的稀疏因子。 有人认为es0.05时称之为稀疏矩阵。 在存储稀疏矩阵时,为节省存储空间,应只 存储非零元素。但由于非零元素的分布一般 没有规律,故在存储非零元素时,必须记下 它所在的行和列的位置(i,)。 每一个三元组(位,j,)唯一确定了矩阵A的一 个非零元素。因此,稀疏矩阵可由表示非零 元素的一系列三元组及其行列数唯一确定。 26
• 设矩阵 A 中有 s 个非零元素。令 e = s/(m×n), 称 e 为矩阵的稀疏因子。 • 有人认为 e≤0.05 时称之为稀疏矩阵。 • 在存储稀疏矩阵时,为节省存储空间,应只 存储非零元素。但由于非零元素的分布一般 没有规律,故在存储非零元素时,必须记下 它所在的行和列的位置 ( i, j )。 • 每一个三元组 (i, j, aij) 唯一确定了矩阵A的一 个非零元素。因此,稀疏矩阵可由表示非零 元素的一系列三元组及其行列数唯一确定。 26
稀疏矩阵的定义 const int drows =6,dcols =7,dterms 9; template<class E> struct Triple{ /川三元组 int row,col; 川非零元素行号/列号 E value; /非零元素的值 void operator (Triple<E>&R) /赋值 row =R.row;col =R.col;value =R.value; }; 27
稀疏矩阵的定义 const int drows = 6, dcols = 7, dterms = 9; template<class E> struct Triple { //三元组 int row, col; //非零元素行号/列号 E value; //非零元素的值 void operator = (Triple<E>& R) //赋值 { row = R.row; col = R.col; value = R.value; } }; 27
template <class E> class SparseMatrix public; SparseMatrix (int Rw drows,int Cl dcols, int Tm dterms); /构造函数 void Transpose(SparseMatrix<E>&b);/转置 void Add (SparseMatrix<E>&a, SparseMatrix<E>&b); //aa+b void Multiply (SparseMatrix<E>&a, SparseMatrix<E>&b); //aa*b pvivate: int Rows,Cols,Terms; /行/列/非零元素数 Triple<E>*smArray; /川三元组表 }; 28
template <class E> class SparseMatrix { public: SparseMatrix (int Rw = drows, int Cl = dcols, int Tm = dterms); //构造函数 void Transpose(SparseMatrix<E>& b); //转置 void Add (SparseMatrix<E>& a, SparseMatrix<E>& b); //a = a+b void Multiply (SparseMatrix<E>& a, SparseMatrix<E>& b); //a = a*b pvivate: int Rows, Cols, Terms; //行/列/非零元素数 Triple<E> *smArray; //三元组表 }; 28
稀疏矩阵的构造函数 template <class E> SparseMatrix<E>:SparseMatrix (int Rw,int Cl,int Tm){ Rows=Rw;Cols Cl;Terms =Tm; smArray new Triple[Terms]; 川三元组表 if (smArray =NULL) cerr<<“存储分配失败!”<end;exit(I); 3 ; 29
稀疏矩阵的构造函数 template <class E> SparseMatrix<E>::SparseMatrix (int Rw, int Cl, int Tm) { Rows = Rw; Cols = Cl; Terms = Tm; smArray = new Triple[Terms]; //三元组表 if (smArray == NULL) { cerr << “存储分配失败!” << endl; exit(1); } }; 29
稀疏矩阵的转置 一个mxn的矩阵A,它的转置矩阵B是一 个nxm的矩阵,且A[1=B[。即 ◆矩阵A的行成为矩阵B的列 ◆矩阵A的列成为矩阵B的行。 在稀疏矩阵的三元组表中,非零矩阵元素按 行存放。当行号相同时,按列号递增的顺序 存放。 稀疏矩阵的转置运算要转化为对应三元组表 的转置。 30
稀疏矩阵的转置 • 一个 mn 的矩阵 A,它的转置矩阵 B 是一 个 nm 的矩阵,且 A[i][j] = B[j][i]。即 u 矩阵 A 的行成为矩阵 B 的列 u 矩阵 A 的列成为矩阵 B 的行。 • 在稀疏矩阵的三元组表中,非零矩阵元素按 行存放。当行号相同时,按列号递增的顺序 存放。 • 稀疏矩阵的转置运算要转化为对应三元组表 的转置。 30