加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-15 05:58:46 所属栏目:安全 来源:网络整理
导读:在矩阵中,有一类很重要的矩阵,就是-----稀疏矩阵。 所谓的稀疏矩阵呢,就是指的是,在矩阵中,有效的数据个数远远小于无效的数据个数 (并且这些数据排列顺序没有规律) 。我们下面先举个稀疏矩阵的例子: 650) this.width=650;" src="http://img.jb51.cc/

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


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

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;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读