扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条








template <class Type>
class SparseMatrix ...{
int Rows, Cols, Terms; //行/列/非零元素数
Trituple<Type> smArray[MaxTerms];
public: //三元组表
SparseMatrix ( int MaxRow, int Maxcol );
SparseMatrix<Type> Transpose ( ); //转置
SparseMatrix<Type> //相加
Add ( SparseMatrix<Type> b );
SparseMatrix<Type> //相乘
Multiply ( SparseMatrix<Type> b );
} 
template<class Type> class SparseMatrix<Type>;
template<class Type> 
class Trituple ...{
friend class SparseMatrix <Type>
private:
int row, col; //非零元素所在行号/列号
Type value; //非零元素的值
} 




template <class Type> SparseMatrix <Type> SparseMatrix <Type>:: Transpose ( ) ...{
//将稀疏矩阵a(*this指示)转置,结果在稀疏矩阵b中。
SparseMatrix<Type> b ( Cols, Rows );//创建一个稀疏矩阵类的对象b
b.Rows = Cols; b.Cols = Rows; //交换其row(行号)与col(列号)的内容,连同value
b.Terms = Terms;//中存储的值作为新三元组放到矩阵的三元组表中。
if ( Terms > 0 ) ...{ //非零元个数不为零
int CurrentB = 0; //转置三元组表存放指针
for ( int k = 0; k < Cols; k++ ) //按列号做扫描,做cols次
for ( int i = 0; i < Terms; i++ ) //在数组中找列号为k的三元组 
if ( smArray[i].col == k) ...{ //第i个三元组中元素的列号为k
b.smArray[CurrentB].row = k; //新三元组的行号
b.smArray[CurrentB].col=smArray[i].row;//新三元组的列号
b.smArray[CurrentB].value=smArray[i].value;//新三元组的值
CurrentB++; //存放指针加1
}
}
return 0;
}

template <class Type> SparseMatrix<Type>
SparseMatrix<Type>::FastTranspos ( ) ...{
//对稀疏矩阵a(*this指示)做快速转置,结果放在b中,时间代价为O(Terms+Columns)。
int *rowSize = new int[Cols];//辅助数组,统计各列非零元素个数
int *rowStart = new int[Cols];//辅助数组,预计转置后各行存放位置
SparseMatrix<Type> b ( Cols, Rows );//存放转置结果
b.Rows = Cols; b.Cols = Rows;
b.Terms = Terms;
if ( Terms > 0 ) ...{
for (int i = 0; i < Cols; i++) rowSize[i] = 0;//统计矩阵b中第i行非零元素个数
for ( i = 0; i < Terms; i++ )
//根据矩阵a中第i个非零元素的列号,将rowSize相当该列的计数加1
rowSize[smArray[i].col]++;
rowStart[0] = 0; //计算矩阵b第i行非零元素的开始存放位置
for ( i = 1; i < Cols; i++ ) //rowStart[i]=矩阵b的第i行的开始存放位置
rowStart[i] = rowStart[i-1]+rowSize[i-1];
for ( i = 0; i < Terms; i++ ) ...{ //从a向b传送
int j = rowStart[smArray[i].col];//j为第i个非零元素在b中应存放的位置
b.smArray[j].row = smArray[i].col;
b.smArray[j].col = smArray[i].row;
b.smArray[j].value = smArray[i].value;
rowStart[smArray[i].col]++;
}
}
delete[ ] rowSize; delete [ ] rowStart;
return b;
}
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。