矩阵的快速转置

Status FastTransposeSMatrix(TSMatrix M, TSMatrix &T) {
// 采用三元组顺序表存储表示,求稀疏矩阵M的转置矩阵T
  int j, p, q, t;
  int *num;  // 保存每一列中的非零元个数
  int *cpos; // 保存转置后每列第一非零元应当在T中所处的序号
  
  //练习1:矩阵T初始化:T.mu、T.nu和T.tu分别应当被初始化为什么值?
  //Add your code here
  //根据线性代数的知识
  //在矩阵转置前后,矩阵中的非零元的个数保持不变
  T.tu=M.tu;
  //转置后矩阵的行数等于原来的矩阵的列数
  T.mu=M.nu;
  //转置后矩阵的列数等于原来的矩阵的行数
  T.nu=M.mu;
  //为T的data域申请空间
  T.data = (Triple *)malloc(sizeof(Triple) * (T.tu + 1));
  if(NULL == T.data)return OVERFLOW;

  num = (int *)malloc((M.nu+1)*sizeof(int));
  cpos = (int *)malloc((M.nu+1)*sizeof(int));
  if (NULL == num || NULL == cpos)
      return OVERFLOW;
      
  if (T.tu!=0) {
      for (j = 1; j <= M.nu; ++j) // 初始化num向量
      num[j] = 0;

      for (t = 1; t <= M.tu; ++t) //练习2:求M中每一列所含非零元的个数,存放于num中
      /*Add your code here*/
      //遍历原来的矩阵,统计每一列有多少个非零元
      num[M.data[t].j]++;

      cpos[1] = 1;
      for (j = 2; j <= M.nu; ++j) //练习3:求每一列的第一个非零元在b.data中的序号
         /*Add your code here*/
         //cpos[j]表示原矩阵的第j列的第一个非零元在转置后的矩阵的结构体中的data域的起始位置
         //由于前面的num数组已经记录了每一列有多少个非零元
         //又因为转置之后行和列的坐标相对于原矩阵对换
         //因此cpos[j]=cops[j-1]+num[j-1]
         //也就是下一个要存入data域的元素应当存入的下标等于上一行(转置后)的第一个元素存入的下标加上上一行的元素个数
         cpos[j]=cpos[j-1]+num[j-1];

      
      for(p=1; p<=M.tu; ++p){ // 转置矩阵元素  
         j = M.data[p].j;
         q = cpos[j]; // cpos[j]指向第j列第一个非零元的位置
	  
         //练习4:转置元素
         //Add your code here 
         T.data[q].e=M.data[p].e;
         T.data[q].i=j;
         T.data[q].j=M.data[p].i;
         
        //练习5:令cpos[j]指向第j列下一个非零元的位置
        //Add your code here;
         cpos[j]++;
    }
  }

    free(num);
    free(cpos);
    return OK;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值