稀疏矩阵的转置

稀疏矩阵:M*N的矩阵,矩阵中的有效值的个数远小于无效值的个数,而且这些数分布没有规律。

压缩存储的值极少,采用三元组(value,row,col)存储每一个有效值。三元组按照在原矩阵的位置,按照行优先存储。

构造函数:

SparseMatrix(T* a,size_t m,size_t n,const T& invalid)
		:_rowsize(m)
		,_colsize(n)
		,_invalid(invalid)
	{
		for(size_t i=0;i<m;i++)
		{
			for(size_t j=0;j<n;j++)
			{
				if(a[i*n+j]!=invalid)
				{
					_a.push_back(Triple<T>(a[i*n+j],i,j));
				}
			}
		}
	}

打印函数:

void Display()
	{
		size_t index=0;
		for(size_t i=0;i<_rowsize;i++)
		{
			for(size_t j=0;j<_colsize;j++)
			{
				if((index<_a.size())&&(_a[index]._row==i)&&(_a[index]._col==j))
					{
						cout<<_a[index]._value<<" ";
						index++;
				    }
				else
					cout<<_invalid<<" ";

			}
			cout<<endl;
		}
		cout<<endl;
	}

普通转置:

SparseMatrix<T> Transport()//O(colsize*有效数值的个数)
	{
		SparseMatrix<T> tmp;
		tmp._rowsize=_colsize;
		tmp._colsize=_rowsize;
		tmp._invalid=_invalid;
		for(size_t i=0;i<_colsize;i++)
			{
				size_t index=0;
				while(index<_a.size())
				{
					for(size_t j=0;j<_a.size();j++)
				  {
					if(_a[j]._col==i)
					{
						tmp._a.push_back(Triple<T>(_a[index]._value,_a[index]._row,_a[index]._col));
					}
					++index;
				  }
				}
			}
		return tmp;
	}

快速转置:

快速转置借用两个数组来实现,rowCount用来存储统计转置后的矩阵每一行的数据个数,rowStart用来存储统计转置后的矩阵每行有效数值在压缩矩阵存储的位置,例如转置后第二行的第一个数在压缩存储的位置等于第一行的第一个有效值的位置+第一行有效值的个数(rowStart[2]=rowStart[1]+rowCount[1])

SparseMatrix<T> FastTransport()
	{
		SparseMatrix<T> tmp;
		tmp._rowsize=_colsize;
		tmp._colsize=_rowsize;
		tmp._invalid=_invalid;

		int* rowCount=new int[_colsize];
		int* rowStart=new int[_colsize];
		memset(rowCount,0,sizeof(int)*_colsize);
		memset(rowStart,0,sizeof(int)*_colsize);

		size_t index=0;
		while(index<_a.size())//统计转置后的矩阵每一行的数据个数
		{
			rowCount[_a[index]._col]++;
			++index;
		}

		rowStart[0]=0;//统计转置后的矩阵每行有效数值在压缩矩阵存储的位置
		for(size_t i=1;i<_colsize;i++)
		{
			rowStart[i]=rowStart[i-1]+rowCount[i-1];
		}

		index=0;
		tmp._a.resize(_a.size());//增加容量,改变size,并初始化
		while(index<_a.size())
		{
			Triple<int> t;
			t._col=_a[index]._row;
			t._row=_a[index]._col;
			t._value=_a[index]._value;
			tmp._a[rowStart[_a[index]._col]++]=t;
			++index;
		}
		return tmp;
	}

三元组:

template<class T>
struct Triple//三元组
{
	Triple(const T& value=T(),size_t row=0,size_t col=0)
		:_value(value)
		,_row(row)
		,_col(col)
	{}
	T _value;
	size_t _row;
	size_t _col;
};

稀疏矩阵压缩存储的成员变量:

vector<Triple<T> > _a;
	size_t _rowsize;
	size_t _colsize;
	T _invalid;
时间: 2024-10-20 09:26:18

稀疏矩阵的转置的相关文章

稀疏矩阵的转置运算

(1)设m*n 矩阵中有t 个非零元素且t远小于m*n,这样的矩阵称为稀疏矩阵.很多科学管理及工程计算中,常会遇到阶数很高的大型稀疏矩阵.如果按常规分配方法,顺序分配在计算机内,那将是相当浪费内存的.为此提出另外一种存储方法,仅仅存放非零元素.但对于这类矩阵,通常零元素分布没有规律,为了能找到相应的元素,所以仅存储非零元素的值是不够的,还要记下它所在的行和列.于是采取如下方法:将非零元素所在的行.列以及它的值构成一个三元组(i,j,v),然后再按某种规律存储这些三元组,这种方法可以节约存储空间.

三元组顺序表表示的稀疏矩阵的转置和加法运算的实现----《数据结构》

#include<stdio.h> #include<malloc.h> #include<stdlib.h> #include<string.h> #define MAXSIZE 225 #define N 9 typedef struct{ int i,j; int e; }Triple; typedef struct{ Triple data[MAXSIZE+1]; int mu,nu,tu; }TSMatrix; int CreatSMatrix(T

稀疏矩阵转置

矩阵是线性代数中的一个知识,刚开始学习的时候可能感觉不到它有什么用处,最初的感觉就是对二维数据的操作.其实现实生活中矩阵的用处太大了,设计领域相当的广泛.在此只讨论稀疏矩阵的转置问题: 可能看到矩阵就会想到二维数组,比如这样一个矩阵: 你可能会想到用二维数组来存放此矩阵中的元素,就像这样:int text[][5] = {{0,5,6,0,4},{0,0,0,0,0},{1,0,0,0,0},{1,0,0,0,0},{0,2,0,0,1}}; 这样好像也没有什么不好.我们再来看看这个矩阵,五行五

稀疏矩阵的压缩存储和转置

1.稀疏矩阵:M*N的矩阵,矩阵中有效值的个数远小于无效值的个数,且这些数据的分布没有规律. 2.稀疏矩阵的压缩存储:压缩存储值存储极少数的有效数据. 由于非零元素分布没有任何规律,所以在进行压缩存储的时侯需要存储无效值的同时还要存储有效元素在矩阵中的位置,即有效元素所在的行号和列号,也就是在存储某个元素比如aij的值的同时,还需要存储该元素所在的行号i和它的列号j,这样就构成了一个三元组(i,j,aij)的线性表. 使用{ row, col, value }三元组存储每一个有效数据,三元组按原

数据结构----稀疏矩阵的快速转置

使用两种方法将稀疏矩阵快速转置 #include<iostream> #include<vector> using namespace std; template<class T> struct Triple  //三元组 { size_t row; size_t col; T _value; }; template<class T> class SparseMatrix { public: SparseMatrix(T *arr, size_t rowsi

稀疏矩阵的普通转置与快速转置算法

稀疏矩阵的普通转置与快速转置算法 一般来说,对于系数矩阵,我们使用三元组来存储.即就是将矩阵的所有非零元素的三元组存放在一个顺序表中,如图所示: 注意一个转置的前提:该顺序表是排好序的,即行优先,列其次. 一.普通转置 这种算法比较简单,也很容易想到: 算法思想: 对M.data从头至尾扫描: ?第一次扫描时,将M.data中列号为1的三元组赋值到T.data中 ?第二次扫描时,将M.data中列号为2的三元组赋值到T.data中 ?依此类推,直至将M.data所有三元组赋值到T.data中 代

稀疏矩阵的压缩存储与转置

稀疏矩阵:矩阵中大多数元素为0的矩阵(本文以行序为主序) 稀疏矩阵的三元组表述法: 类型结构: template <typename T> struct Triple { int _row; int _col; T _value; }; template <typename T> class SparseMatrix { public: SparseMatrix<T>::SparseMatrix(); SparseMatrix(const T* array, size_

稀疏矩阵三元组快速转置(转poklau123写的很清楚)

关于稀疏矩阵的快速转置法,首先得明白其是通过对三元表进行转置.如果误以为是对矩阵进行转置,毫无疑问就算你想破脑袋也想不出个所以然,别陷入死胡同了! 对于一个三元表,行为i,列为j,值为v.需将其i与j的值对调才能得到新的三元表,但是如果直接进行转换,得到的新的三元表的顺序是混乱的,不符合三元表的规则.所以,课本首先介绍了一个用扫描来转置的算法(这个算法比较容易,在这里我就不说了),但是这个转置算法的时间复杂度太高,于是就有了接下来的快速转置算法. 要你对一个三元表进行步骤最少的转置,你可能会想,

稀疏矩阵转置+快速转置

稀疏矩阵转置 Description 稀疏矩阵的存储不宜用二维数组存储每个元素,那样的话会浪费很多的存储空间.所以可以使用一个一维数组存储其中的非零元素.这个一维数组的元素类型是一个三元组,由非零元素在该稀疏矩阵中的位置(行号和列号对)以及该元组的值构成. 矩阵转置就是将矩阵行和列上的元素对换. 现在就请你对一个稀疏矩阵进行转置.以下是稀疏矩阵转置的算法描述: 图:稀疏矩阵转置的算法描述 Input 输入的第一行是两个整数r和c(r*c <= 12500),分别表示一个包含很多0的稀疏矩阵的行数