您的位置:首页 > 编程语言

稀疏矩阵【压缩算法】,具体代码没有,只是思想

2012-07-20 14:33 375 查看
/*** 稀疏矩阵的知识,比较重要的是压缩存储!* 定义: 假设m行n列的矩阵中,只有t个非零元素,则成 t/(m*n)为稀疏因子,当稀疏因子<=0.05的时候称为稀疏矩阵* 产生的问题: 大约95%的元素都是0,占用的空间很大,计算的时候也和这些0做了很多运算(+,-,*,/),而/法还不能除0,所以特别麻烦** 压缩存储:* (1)特殊矩阵(三角矩阵,对角矩阵)的压缩存储比较简单* (2)随机稀疏矩阵的压缩存储:1.三元组顺序表元素类型:(行号,列号,元素值)稀疏矩阵类型:(一个数组,行数,列数,非零元个数)  //改进后的类型是里面还存在一个记录每一行首非零元出现的位置的Const MaxSize = 1000;typedef struct{int i;int j;ElemType e;}Triple;		//元素类型typedef union{Triple data[MaxSize + 1];int mu;int nu;int tu;}TSMatrix;	//稀疏矩阵类型求转置的话:要考虑转过了之后要放到指定的位置【按行从小到大排,所以要做一点操作】int FastTransposeSMatrix(TSMatrix M, TSMatrix & T){T.mu = M.nu;	//转置的行和列 等于 原来的矩阵的 列和行T.nu = M.mu;T.tu = M.tu;	//非零元个数是相等的if (T.tu){for (col=1; col<=M.nu; ++col){num[col] = 0;			//这个是初始化的for循环 -> 要计算转置后每行的非零元个数}for (t=1; t<=M.tu; ++)  //要计算转置后每行的非零元个数,就是计算原来未转置前的 列[转过来之后,原来的列就成了行了] 的非零元个数{++num[M.data[t].j];}//下面为求转置矩阵每一行第一个非零元在data数组中的位置,也就是求原来的每一列的第一个非零元的位置cpot[1] = 1;		//第一行的起始位置是1for (col=2; col<=M.nu; ++col)	//求每一行的第一个非零元的位置, 之后转置在某行插入一个元素之后,对应的行的cpot要+1{cpot[col] = cpot[col-1] + num[col-1]; //第col行的元素的起始位置为  col-1行的起始位置 + col-1行的非零元个数}for (p=1; p<=M.tu; ++p){//转置矩阵元素, 然后根据cpot放到相应的位置}}}2.三元组顺序存储改进【和方法1差别在于有存储每一行非零元的个数】(常用) -- 代码不详3.十字链表【方法1和方法2都是顺序结构,不适合结构的改变.(插入,删除,移动不方便),所以引出第三种:链式存储】(做矩阵的加法的时候,这个十字链表可以试试)**/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: