稀疏矩阵转置

来源:互联网 发布:扫一扫数学解题软件 编辑:程序博客网 时间:2024/05/21 10:06

稀疏矩阵转置

/*
 -------------存储结构-三元组-----------------
 #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;
原创粉丝点击