在矩阵中,有一类很重要的矩阵,就是-----稀疏矩阵。
所谓的稀疏矩阵呢,就是指的是,在矩阵中,有效的数据个数远远小于无效的数据个数(并且这些数据排列顺序没有规律)。我们下面先举个稀疏矩阵的例子:
有效数据个数仅仅6个,其余都为无效数据0.
那我们将稀疏矩阵存在压缩矩阵中,设定一个三元组,使用{row,col,value}存储每一个有效数据,三元组按原矩阵中的位置,以行优先级先后顺序依次存放。
我们建立一个结构体:
- structTriple//定义一个三元组,用来存储稀疏矩阵的x,y,坐标值
- {
- int_row;
- int_col;
- T_value;
- };
将每一个有效数据(三元组)存在顺序表vector中,打印数据就按照顺序表的特点打印。
矩阵的转置:
所以,转置就是将原矩阵的行、列对换,也就是将[i][j]和[j][i]位置上的数据对换。
代码如下:
- #include<vector>
- template<classT>
- structTriple//定义一个三元组,用来存储稀疏矩阵的x,坐标值
- {
- int_row;
- int_col;
- T_value;
- Triple(introw,intcol,intvalue)
- :_row(row),_col(col),_value(value)
- {}
- };
- template<classT>
- classSparseMatrix
- {
- public:
- SparseMatrix(T*a,intm,intn,constT&invalid)
- {
- for(inti=0;i<m;i++)
- {
- for(intj=0;j<n;j++)
- {
- if(invalid!=a[i*n+j])
- {
- //将每一个有效数据(三元组)存在顺序表vector中
- Triple<T>tmp(i,j,a[i*n+j]);
- _a.push_back(tmp);
- }
- }
- }
- }
- //用坐标形式打印稀疏矩阵
- voidDisplay(intm,constT&invalid)
- {
- cout<<"用坐标形式打印稀疏矩阵"<<endl;
- cout<<"{"<<"x,"<<""<<"y,"<<""<<"value"<<"}"<<endl;
- for(intk=0;k<_a.size();k++)
- {
- cout<<"{"<<_a[k]._row<<","<<
- _a[k]._col<<","<<_a[k]._value<<""<<
- "}"<<endl;
- }
- }
- //用矩阵形式打印稀疏矩阵
- voidDisplayMatrix(intm,constT&invalid)
- {
- cout<<"用矩阵形式打印稀疏矩阵"<<endl;
- intk=0;
- for(inti=0;i<m;i++)
- {
- for(intj=0;j<n;j++)
- {
- if(k<_a.size()&&_a[k]._row==i&&_a[k]._col==j)
- {
- cout<<_a[k]._value<<"";
- k++;
- }
- else
- {
- cout<<invalid<<"";
- }
- }
- cout<<endl;
- }
- }
- //矩阵转置
- SparseMatrix<T>Transport(T*a,constT&invalid)
- {
- cout<<"矩阵转置:"<<endl;
- intb[5][6];//行列互换大小
- for(inti=0;i<m;i++)//行列互换大小
- {
- for(intj=0;j<n;j++)
- {
- //将一维数组形式的元素转换为[j][i]形式
- b[j][i]=a[i*n+j];
- }
- }
- SparseMatrix<T>TranMatrix((int*)b,5,6,0);
- returnTranMatrix;
- }
- protected:
- vector<Triple<T>>_a;
- };
- voidTest()
- {
- inta[6][5]={
- {1,3,5},{0,0},{2,4,6},};
- intm=6;
- intn=5;
- SparseMatrix<int>sm((int*)a,m,n,0);
- sm.Display(m,0);
- sm.DisplayMatrix(m,0);
- SparseMatrix<int>sm1((int*)a,0);
- sm1=sm.Transport((int*)a,0);
- sm1.Display(n,0);
- sm1.DisplayMatrix(n,0);
- }
- intmain()
- {
- Test();
- system("pause");
- return0;
- }