- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
矩阵的存储及转置算法剖析
矩阵的存储及转置算法
本文要点:
1.对称矩阵与稀疏矩阵
2.两种矩阵的压缩存储
3.代码实现两种矩阵
对称矩阵SymmetryMatrix
1.对称矩阵也是一种特殊矩阵,满足Aij = Aji(设矩阵为A,且有0=iN-1 0=jN-1),这种矩阵以对角线分割为上三角和下三角,关于对角线对称的元素相等。
2.对称矩阵的压缩存储
如果把矩阵中的每个元素都存储起来,那么就会显得浪费空间,因为每两个关于对角线对称的元素相等,因此就可以将矩阵压缩存储到一个数组Array中,即:将对称的两个元素存一份,对角线上的元素都存储起来,也就是说只存储上三角或下三角,那么存储的元素的总个数就为n(n+1)/2个,这样,当n特别大的时候,也就最有效。
压缩存储的数组与矩阵之间满足:Array[i*(i+1)/2+j] = Martix[i][j](下三角存储i=j)
3.代码实现
[cpp]?view plain?copy
?
templateclass?T??
class?SymmetryMatrix??
{??
public:??
????SymmetryMatrix(const?T*?a,size_t?n)??
????????:_matrix(new?T[n*(n+1)/2])??
????????,_size(n*(n+1)/2)??
????????,_n(n)??
????{??
????????size_t?index?=?0;???//表示一维数组的下标??
????????for?(size_t?i=0;?in;?++i)??
????????{??
????????????for?(size_t?j=0;?jn;?++j)??
????????????{??
????????????????if?(i?=?j)??????//存储下三角??
????????????????{??
????????????????????_matrix[index++]?=?a[i*n+j];??
????????????????????//index++;??
????????????????}??
????????????????else??
????????????????????continue;??
????????????}??
????????}??
????}??
??
????T?Access(size_t?row,size_t?col)????//访问数据??
????{??
????????if?(row??col)??
????????{??
????????????std::swap(row,col);??
????????}??
????????return?_matrix[row*(row+1)/2+col];??
????}??
??
????void?Display()??
????{??
????????for?(size_t?i=0;?i_n;?i++)??
????????{??
????????????for?(size_t?j=0;?j_n;?j++)??
????????????{??
????????????????coutAccess(i,j)?;??
????????????}??
????????????coutendl;??
????????}??
????}??
protected:??
????T*?_matrix;?????//压缩存储的一维数组??
????size_t?_size;???//可存储的大小??
????size_t?_n;??????//行列的大小???????
};??
稀疏矩阵SparseMatrix
1.稀疏矩阵中,有效数据(非0)的数量远小于非法数据的个数(0为非法数据)
2.稀疏矩阵的存储也是压缩存储的,但与对称矩阵不同的地方有两点:
(1)稀疏矩阵的压缩存储只存储有效值;
(2)稀疏矩阵存储以行优先的顺序存储在三元组中,表示为:{row,col,value},row和col分别表示该有效值的行和列。
一、存储及输出
存储的方法类似于对称矩阵的存储,但要将行和列也进行存储;
输出的时候多考虑表示数组的下标会不会越界
[cpp]?view plain?copy
?
//数据的存储??
SpareMatrix(const?T*?a,size_t?row,size_t?col,const?T?invalid)??
????:_rowSize(row)??
????,_colSize(col)??
????,_invalid(invalid)??
{??
????for(size_t?i=0;?irow;?i++)??
????{??
????????for
文档评论(0)