C++下的稀疏矩阵
C++下的稀疏矩阵
数据结构中关于稀疏矩阵的学习
稀疏矩阵的定义
矩阵中元素为0的占比大于不为0元素占比的矩阵(PS: 下面代码并没有严格按照这个去判断是否为稀疏矩阵。 只是写了 稀疏矩阵的部分方法 为了研究一下矩阵的数据结构)
- 定义记录非元素值和位置的结构体
struct Item
{
int col;//第几列
friend class SparseMatrix<T>;
int row;//第几行
T val;//值
};
2.稀疏矩阵类的数据声明
private:
int cols;//列数
int rows;//行数
int item_count;//不为0元素的个数
Item<T>* aItms;//不为0的结构体数组
int max_size;//最大 个数
计算稀疏矩阵的转置矩阵
- 声明转置矩阵 列数= 当前矩阵的行数 行数=当前矩阵的列数 稀疏元素个数相同
b.cols = this->rows;
b.rows = this->cols;
b.item_count = this->item_count;
- 从原矩阵的第一列开始(因为反转后第一列就是新矩阵的第一行,所以第一列的第一个非0元素即为转置矩阵的第一个非0的元素) 沿列遍历,查看原稀疏矩阵的当前位置是否有稀疏元素.有则加到转置矩阵中 并且个数+1;
for(int iCol=1;iCol<=this->cols;iCol++)
{
for(int index=0;index<this->item_count;index++)
{
if(this->aItms[index].col == iCol){
b.aItms[count].val = this->aItms[index].val;
b.aItms[count].col = this->aItms[index].row;
b.aItms[count].row = this->aItms[index].col;
count++;
}
}
}
计算稀疏矩阵的相加结果:比如保证行列数相同
1.同时游动两个稀疏数组 如果两个稀疏数不在同一位置 将位置较前的一个先加入新的矩阵里
2.如果两个位置相同则判断两个相加是否为0 不为0则加入其值其位置
3.因为同时遍历两个矩阵数组,所以可能一个结束后另一个还没结束 所以结束后应将所有的未遍历到的直接加入.
SparseMatrix<T> Add(const SparseMatrix<T> &b) const
{
if(b.cols!=this->cols||b.rows!=this->rows)
{
throw std::runtime_error(std::string("col and row error"));
}
SparseMatrix<T> a(this->max_size);
a.cols = this->cols;
a.rows = this->rows;