矩阵的存储及快速转置

#include<iostream>
#include<vector>
#include<string>
using namespace std;
//三元组
template<class T>
struct Triple
{
	size_t _row;
	size_t _col;
	T _value;
};
template<class T>
class SparseMatrix
{
public:
	SparseMatrix();
	SparseMatrix(T* a,size_t row,size_t col,const T& invalid);
	SparseMatrix(const SparseMatrix<T>& sm);
	SparseMatrix<T>& operator=(const SparseMatrix<T>& sm);
	~SparseMatrix();
	void Display();
	SparseMatrix& Transpose();
	SparseMatrix& FastTranspose();
private:
	vector<Triple<T>> _array;
	size_t _rowSize;
	size_t _colSize;
	T _invalid;
};
template<class T>
SparseMatrix<T>::SparseMatrix()
	:_rowSize(0)
	,_colSize(0)
	,_invalid(0)
{}
template<class T>
SparseMatrix<T>::SparseMatrix(T* a,size_t row,size_t col,const T& invalid)
	:_rowSize(row)
	,_colSize(col)
	,_invalid(invalid)
{
	for(size_t i=0;i<_rowSize;i++)
	{
		for(size_t j=0;j<_colSize;j++)
		{
			if(a[i*_colSize+j]!=_invalid)
			{
				Triple<T> t;
				t._row=i;
				t._col=j;
				t._value=a[i*_colSize+j];
				_array.push_back(t);
			}
		}
	}
}
template<class T>
SparseMatrix<T>::SparseMatrix(const SparseMatrix<T>& sm)
	:_rowSize(sm._rowSize)
	,_colSize(sm._colSize)
	,_invalid(sm._invalid)
{
	for(size_t i=0;i<sm._array.size();i++)
	{
		_array.push_back(sm._array[i]);
	}
}
template<class T>
SparseMatrix<T>& SparseMatrix<T>::operator=(const SparseMatrix<T>& sm)
{
	_rowSize=sm._rowSize;
	_colSize=sm._colSize;
	_invalid=sm._invalid;
	for(size_t i=0;i<_sm.array.size(;i++))
	{
		_array.push_back(sm._array[i]);
	}
	return *this;
}
template<class T>
SparseMatrix<T>::~SparseMatrix()
{}
template<class T>
void SparseMatrix<T>::Display()
{
	size_t index=0;
	for(size_t i=0;i<_rowSize;i++)
	{
		for(size_t j=0;j<_colSize;j++)
		{
			if(index<_array.size()&&(_array[index]._row==i)
				&&(_array[index]._col==j))
			{
				cout<<_array[index]._value;
				index++;
			}
			else
			{
				cout<<_invalid;
			}
			cout<<" ";
		}
		cout<<endl;
	}
	cout<<endl;
}
//一般转置
template<class T>
SparseMatrix<T>& SparseMatrix<T>::Transpose()
{
	SparseMatrix<T> sm;
	 for(size_t i=0;i<_colSize;i++)
	 {
		for(size_t index=0;index<_array.size();index++)
		{
			if(_array[index]._col==i)
			{
				Triple<T> t;
				t._row=_array[index]._col;
				t._col=_array[index]._row;
				t._value=_array[index]._value;
				sm._array.push_back(t);
			}
		}
	 }
	swap(sm._array,_array);
	swap(_rowSize,_colSize);
	return *this;
}
//快速转置
template<class T>
SparseMatrix<T>& SparseMatrix<T>:: FastTranspose()
{
	 int* RowCounts=new int[_colSize];//统计转置后每行数据个数 //2 0 2 0 2
	 int* RowStart=new int[_colSize];//统计转置后每行数据起始位置//  new 出的大小为什么是_colSize,必须得是他吗  //是的,用后面的例子解释 0 2 2 4 4
	 memset(RowCounts,0,sizeof(int)*_colSize);
	 //初始化 RowCounts
	 memset(RowStart,0,sizeof(int)*_colSize);
	 for(size_t index=0;index<_array.size();index++)
	 {
		 RowCounts[_array[index]._col]++;
	 }
	  //初始化 RowStart
	 RowStart[0]=0;
	 for(size_t index=1;index<_colSize;index++)
	 {
		 RowStart[index]= RowStart[index-1]+RowCounts[index-1];
	 }
	 RowStart[0]=0;
	 for(int index=0;index<_array.size();index++)
	 {
		 Triple<T> t;
		 t._row=_array[index]._col;
		 t._col=_array[index]._row;
		 t._value=_array[index]._value;
	 }
	return *this;
}
void Test1()
{
	int a[]={1,0,3,0,5,0,0,0,0,0,0,0,0,0,0,1,0,3,0,5,0,0,0,0,0,0,0,0,0,0,0,};
	SparseMatrix<int> sm1(a,6,5,0);
	sm1.Display();
	SparseMatrix<int>sm2(sm1);
	sm2.Display();
	SparseMatrix<int>sm3=sm1;
	sm3.Display();
}
void Test2()
{
	int a[6][5]={
					{1,0,3,0,5},
					{0,0,0,0,0},
					{0,0,0,0,0},
					{1,0,3,0,5},
					{0,0,0,0,0},
					{0,0,0,0,0}
	};
	SparseMatrix<int> sm1(a[0],6,5,0);
	sm1.Display();
	SparseMatrix<int> sm2=sm1.Transpose();
	sm2.Display();
	SparseMatrix<int> sm3=sm1.FastTranspose();
	sm3.Display();
}
int main()
{
	//Test1();
	Test2();
	system("pause");
	return 0;
}
时间: 2024-10-07 04:37:51

矩阵的存储及快速转置的相关文章

稀疏矩阵的压缩存储及快速转置

当一个矩阵为稀疏矩阵时,有效数据的个数比无效数据要少得多,因此若将一个矩阵全部存储会浪费空间,可以只将有效数据存储起来,无效数据作为标记 代码如下: #include <iostream> #include <vector> using namespace std; //可用一个三元组来存储有效数据的信息 template<class T> struct Triple {  size_t _row;  size_t _col;  T _value; }; //系数矩阵类

稀疏矩阵-压缩存储-列转置法- 一次定位快速转置法

稀疏矩阵的压缩存储 压缩存储值存储极少数的有效数据.使用{row,col,value}三元组存储每一个有效数据,三元组按原矩阵中的位置,以行优先级先后顺序依次存放. 压缩存储:行优先一行一行扫 有效数据存入以为矩阵_arr 列转置法 : 从前向后遍历压缩矩阵,先找列号为0的存入 转置矩阵的压缩矩阵.然后从前向后找列号为1的 ...直到转置矩阵的压缩矩阵大小和 原矩阵的一样大 这时就找完了 时间复杂度为    O(原矩阵列数 * 压缩矩阵长度) 一次定位快速转置法: 设置两个辅助矩阵 RowCou

C++实现稀疏矩阵的压缩存储、转置、快速转置

/*稀疏矩阵的压缩存储.转置.快速转置*/ #include <iostream> using namespace std; #include <vector> //三元组 template<class T> struct Triple { size_t _row; size_t _col; T _value; Triple(size_t row = 0, size_t col = 0, const T& value = T()) :_row(row) ,_co

c++矩阵的转置和快速转置

矩阵的转置 将原矩阵的行.列对换,也就是将[i][j]和[j][i]位置上的数据对换. 程序代码: #include<vector>   //稀疏矩阵push pop operator[] 和顺序表一致   template<class T> struct Triple  //定义一个三元组 可以直接访问的定义成struct { size_t _row; size_t _col; T _value;   Triple(size_t row, size_t col, const T&

【数据结构之旅】稀疏矩阵的快速转置

说明: 稀疏矩阵的快速转置算法的核心在于,用一个数组num记录原来矩阵中的每列非零元个数,用另一个数组cpos来记录原矩阵每列第一个非零元在新矩阵中的位置,以此来达到快速转置的目的. 用这样的方法,主要是希望,矩阵转置后,存储顺序依然是按照行来存储的. 1.实现及代码注释 根据上面的核心提示,可以有如下的代码,下面的代码中的注释已经非常详细,因此这里就不把每一部分实现的功能独立开来了: #include<stdio.h> #include<stdlib.h> #define OVE

稀疏矩阵的列序递增法和一次定位快速转置法

稀疏矩阵:矩阵中大多数元素为0的矩阵,从直观上讲,当非零元素个数低于总元素的30%时,这样的矩阵为稀疏矩阵. 如: int array [6][5] =     {{1, 0, 3, 0, 5}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {1, 0, 3, 0, 5}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}}; 稀疏矩阵的压缩存储:使用{row,col,value}三元组存储每一个有效数据,三元组按原矩阵中的位置,以行优先级先后顺序依次存放

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

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

矩阵压缩存储之三元组顺序表

形态: 实现: /***************************************** 稀疏矩阵的三元组顺序表存储表示 by Rowandjj 2014/5/3 ******************************************/ #include<IOSTREAM> using namespace std; #define MAXSIZE 12500//非零元个数的最大值 typedef int ElemType; typedef struct _DATA_

稀疏矩阵转置+快速转置

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