【求助】稀疏矩阵的快速转置!
程序代码:
void transpose(term a[],term b[])
{
int row_terms[MAX],startingpos[MAX];
int i,j,num_cols=a[0].col,num_terms=a[0].value;
b[0].row=num_cols;b[0].col=a[0].row;
b[0].value=num_terms;
if(num_terms>0)
{
for(i=0;i<num_cols;i++)
{
row_terms[i]=0;
}
for(i=1;i<num_terms;i++)
{
row_terms[a[i].col]++;//记录每行的元素数量
}
startingpos[0]=1;
for(i=1;i<num_cols;i++)
{
startingpos[i]=startingpos[i-1]+row_terms[i-1];//转置矩阵第i行开始位置保存在starting_pos[i]中????看不懂!!!!
}
for(i=1;i<=num_terms;i++)
{
j=startingpos[a[i].col]++;//++运算符的作用?
b[j].row=a[i].col;
b[j].col=a[i].row;
b[j].value=a[i].value;
}
}
}
附上书本原话:转置矩阵第i行元素数量保存在row_terms[i]中,而转置矩阵第i行开始位置保存在starting_pos[i]中。
下面是测试数据:
程序代码:
#define MAX 9
typedef struct {
int row;
int col;
int value;
}term;
term a[MAX]={{6,6,8},{0,0,15},{0,3,22},{0,5,-15},{1,1,11},{1,2,3},{2,3,-6},{4,0,91},{5,2,28}};下面是打印函数代码:
程序代码:
void prints_matrix_test(term *arry)
{
int i,j;
int k=1;
for(i=0;i<(*arry).col;++i)
{
for(j=0;j<(*arry).row;++j)
{
while(k<MAX)//通过循环遍历到符合位置的元素并打印
{
if(i==(*(arry+k)).col&&j==(*(arry+k)).row)
{
printf("%4d",(*(arry+k)).value);
break;
}
++k;
}
if(k==MAX)
{
printf("%4d",0);
}
k=1;//k重置,为下一次循环做准备
}
printf("\n");
}
}
好久没上论坛了!!!!有点陌生鸟!







[ 本帖最后由 liangjinchao 于 2011-7-30 23:11 编辑 ]









