您的位置:首页 > 其它

稀疏矩阵的转置

2014-06-24 15:59 302 查看
//稀疏矩阵的转置

//使用了两个辅助数组

//num  : num[j] : 矩阵A中第j列非零元素的个数

//cpot : cpot[j]: 矩阵A中第j列的第一个非零元素在其转置矩阵B的三元组顺序表的位置。

//推出2个规则:

//1 cpot[1] = 1;

//2 cpot[j] = cpot[j-1]+num[j-1];

//算法思路:

//根据1,2规则计算num数组和cpot数组

//根据cpot数组的指示求转置,将A的三元组顺序表中每个元素直接放入B的三元组顺序表中的适当位置.

#define max 100

struct element

{

 int row,col; //行下标,列下标

 int value;   //值

};

struct triple

{

 int m; //行数

 int n; //列数

 int t; //非0元素个数

 element list[max+1]; //存放的位置

};

void transpos(triple &A,triple &B)

{//求A的转置数组B

 int num[max+1]; //A每列非0元素的个数 

 int cpot[max+1];//A的某列非0元素在B的三元组中的位置

 //基本信息的复制

 B.m = A.n;

 B.n = A.m;

 B.t = A.t;

 if(B.t>0)

 {//如果存在非0的元素,这个时候才需要转置

  //初始化num数组 num[j] : j列中非0元素的个数

  //初始化 

  for(j=1;j<=A.n;j++)

  {

   num[j] = 0;

  }

  //求A中每一列中非0元素的个数

  for(j=1;j<=A.t;j++)

  {

   num[A.list[j].col]++; //

  }

  //num已经初始化好了

  //初始化cpot;

  cpot[1] = 1;

  for(j=2;j<=A.n;j++)

  {

   cpot[j] = cpot[j-1] +num[j-1];

  }

  //cpot也初始化好了

  //求转置

  for(p=1;p<=A.t;p++)

  {

   j = A.list[p].col; //j是某元素的列数

   i = cpot[j];       //i是A的j列应该存储在B的三元组的首位

   B.list[i].row = A.list[p].col;

   B.list[i].col = A.list[p].row;

   B.list[i].data =A.list[p].value;

   cpot[j]++;

  }

 }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法