【数据结构】稀疏结构及稀疏矩阵的压缩存储,矩阵的转置

在矩阵中,有一类很重要的矩阵,就是-----稀疏矩阵。


所谓的稀疏矩阵呢,就是指的是,在矩阵中,有效的数据个数远远小于无效的数据个数(并且这些数据排列顺序没有规律)。我们下面先举个稀疏矩阵的例子:

wKiom1cNoXqgYIYUAAAPLNUT7Mw525.png

有效数据个数仅仅6个,其余都为无效数据0.


那我们将稀疏矩阵存在压缩矩阵中,设定一个元组,使用{row,col,value}存储每一个有效数据,三元组按原矩阵中的位置,以行优先级先后顺序依次存放。

我们建立一个结构体:

structTriple//定义一个元组,用来存储稀疏矩阵的x,y,坐标值
{
int_row;
int_col;
T_value;
};

将每一个有效数据(三元组)存在顺序表vector中,打印数据就按照顺序表的特点打印。

矩阵的转置:


wKiom1cNoyLgdIoCAAAda7pd8GI613.png

所以,转置就是将原矩阵的行、列对换,也就是将[i][j]和[j][i]位置上的数据对换。


代码如下:

#include<vector>

template<classt>
structTriple//定义一个元组,用来存储稀疏矩阵的x,坐标值
{
int_row;
int_col;
T_value;

Triple(introw,intcol,intvalue)
:_row(row),_col(col),_value(value)
{}
};



template<classt>
classsparseMatrix
{
public:
SparseMatrix(T*a,intm,intn,constT&invalid)

{
for(inti=0;i<m;i++)
{
for(intj=0;j<n;j++)
{
if(invalid!=a[i*n+j])
{
//将每一个有效数据(三元组)存在顺序表vector中
Triple<T>tmp(i,j,a[i*n+j]);

_a.push_back(tmp);
}

}
}
}


//用坐标形式打印稀疏矩阵
voiddisplay(intm,constT&invalid)
{
cout<<"用坐标形式打印稀疏矩阵"<<endl;
cout<<"{"<<"x,"<<""<<"y,"<<""<<"value"<<"}"<<endl;
for(intk=0;k<_a.size();k++)
{

cout<<"{"<<_a[k]._row<<","<<
_a[k]._col<<","<<_a[k]._value<<""<<
"}"<<endl;
}
}

//用矩阵形式打印稀疏矩阵
voiddisplayMatrix(intm,constT&invalid)
{
cout<<"用矩阵形式打印稀疏矩阵"<<endl;
intk=0;
for(inti=0;i<m;i++)
{
for(intj=0;j<n;j++)
{

if(k<_a.size()&&_a[k]._row==i&&_a[k]._col==j)
{
cout<<_a[k]._value<<"";
k++;
}
else
{
cout<<invalid<<"";
}
}
cout<<endl;
}
}

//矩阵转置
SparseMatrix<T>Transport(T*a,constT&invalid)
{
cout<<"矩阵转置:"<<endl;
intb[5][6];//行列互换大小
for(inti=0;i<m;i++)//行列互换大小
{
for(intj=0;j<n;j++)
{
//将一维数组形式的元素转换为[j][i]形式
b[j][i]=a[i*n+j];
}
}

SparseMatrix<T>TranMatrix((int*)b,5,6,0);
returnTranMatrix;
}

protected:
vector<Triple<T>>_a;

};



voidtest()
{

inta[6][5]={
{1,3,5},{0,0},{2,4,6},};

intm=6;
intn=5;
SparseMatrix<int>sm((int*)a,m,n,0);
sm.display(m,0);
sm.displayMatrix(m,0);
SparseMatrix<int>sm1((int*)a,0);
sm1=sm.Transport((int*)a,0);


sm1.display(n,0);
sm1.displayMatrix(n,0);
}

intmain()
{
test();
system("pause");
return0;
}

相关文章

【啊哈!算法】算法3:最常用的排序——快速排序       ...
匿名组 这里可能用到几个不同的分组构造。通过括号内围绕的正...
选择排序:从数组的起始位置处开始,把第一个元素与数组中其...
public struct Pqitem { public int priority; ...
在编写正则表达式的时候,经常会向要向正则表达式添加数量型...
来自:http://blog.csdn.net/morewindows/article/details/6...