稀疏矩阵转置

作者在 2008-04-15 10:32:18 发布以下内容
/*
-------------存储结构-三元组-----------------
#define MAXSIZE 10000    /*非0元素个数最大值10000*/
   typedef struct{              
         int i,j;                   /*非0元素的行、列下标*/
ElemType e;                    /*非0元素值*/
}Triple;
typedef struct{              /*稀疏距阵存储结构*/
     Triple data[MAXSIZE+1];/*三元组数组存储非0元*/
         int mu,nu,tu;           /*距阵的行列数目以及非0元个数*/
   }TSMatrix;       
传统算法:
按照列的从小到大顺序依次在三元组中寻找对应的元素(列标相同)为结果距阵的行元素。
*/
Status TransposeSMatrix(TSMatrix M,TSMatrix& T){
          /*
          将稀疏距阵的三元组M进行转置操作,转置结果保存到三元组T中,即得到稀疏距阵M的转置距阵。
         */
         T.mu=M.nu;
         T.nu=M.mu;
         T.tu=M.tu;
         if(T.tu){ /*如果非0元素个数不为0*/
           q=1;    /*结果三元组T的工作存储下标*/
           for(col=1;col<=M.nu;col++)   /*第col列等列标的元素作为结果距阵的第i行的元素*/
               for(p=1;p<=M.tu;p++)    /*依次在M中寻找等列的元素*/
                   if(M.data[p].j==col){ /*找到目标元素进行转置运算*/
                      T.data[q].i=M.data[p].j;
                       T.data[q].j=M.data[p].i;
                      T.data[q].e=M.data[p].e;
                       q++;
                    }
         }
         return OK;
}
/*
快速转置:
未转置之前就确定了工作对象三元组M中的元素在结果三元组T中的位置。
增加了两个辅助数组:
num[i]:表示稀疏距阵中第i列非0元素的个数
cpot[i]:表示M中第i列在结果三元组T中第一个元素的位置
*/
Status FastTransposeSMatrix(TSMatrix M,TSMatix& T){
          /* 对稀疏距阵M进行快速转置操作结果存储在T中*/
           T.mu=M.nu;
           T.nu=M.mu;
          T.tu=M.tu;
           if(T.tu){
            for(col=1;col<=M.nu;col++) /*num数组初始化*/
                num[col]=0;
            for(i=1;i<=M.tu;i++)          /*统计每列非0元的个数*/
                num[M.data[i].j]++;
            cpot[1]=1;
            for(t=1;t<=M.nu;t++)       /*计算每列开头元素在T中位置*/
                cpot[t]=cpot[t-1]+num[t-1];
            for(p=1;p<=M.tu;p++){   /*依次对每一个三元组M中进行转置*/
                k=M.data[p].j;
                q=cpot[k];
                 T.data[q].i=M.data[p].j;
                T.data[q].j=M.data[p].i;
                 T.data[q].e=M.data[p].e;
                cpot[k]++;                /*k列的起始位置加1*/
             }
          }
          return OK;
}
文章评论,共0条
游客请输入验证码
浏览55069次
最新评论