数据结构-C++下的稀疏矩阵

C++下的稀疏矩阵

C++下的稀疏矩阵

	数据结构中关于稀疏矩阵的学习

稀疏矩阵的定义

矩阵中元素为0的占比大于不为0元素占比的矩阵(PS: 下面代码并没有严格按照这个去判断是否为稀疏矩阵。 只是写了 稀疏矩阵的部分方法 为了研究一下矩阵的数据结构)
  1. 定义记录非元素值和位置的结构体
		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;//最大 个数

计算稀疏矩阵的转置矩阵

  1. 声明转置矩阵 列数= 当前矩阵的行数 行数=当前矩阵的列数 稀疏元素个数相同
	b.cols = this->rows;
	b.rows = this->cols;
	b.item_count = this->item_count;
  1. 从原矩阵的第一列开始(因为反转后第一列就是新矩阵的第一行,所以第一列的第一个非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;
     
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值