若有下面这样一个矩阵
0 | 0 | 1 | 3 | 0 |
5 | 6 | 7 | 0 | 0 |
如果按照上篇所用的数据结构存储如下 a:
row | col | value | |
s[0] | 0 | 2 | 1 |
s[1] | 0 | 3 | 3 |
s[2] | 1 | 0 | 5 |
s[3] | 1 | 1 | 6 |
s[4] | 1 | 2 | 7 |
转换后的 b:
row | col | value | |
s[0] | 0 | 1 | 5 |
s[1] | 1 | 1 | 6 |
s[2] | 2 | 0 | 1 |
s[3] | 2 | 1 | 7 |
s[4] | 3 | 0 | 3 |
设一个变rowsize[ ](转化后的)
rowsize[0]=0,rowsize[1]=1,rowsize[2]=2,rowsize[3]=1,rowsize[4]=1
rowstart[i]=rowstart[i-1]+rowsize[i-1];
rowstart[0]=0;rowstart[1]=1,rowstart[2]=2,rowstart[3]=4,rowstart[4]=5;
由上面两个表我们观察可以看出。a.s[0]放在b中为b.s[2].此时2正是a.s[0]所在列转化成行的开始位置rowstart[2]=2;
此时b.s[2].row=a.s[0].col;b.s[2].col=a.s[0].row;
开始位置便是在B中的位置,然后把开始位置后移一位。
具体代码如下:
spareMatrix fastTranspose()
{
spareMatrix b(row ,col,terms);
if(terms>0)
{
int * rowsize=new int[col];
int * start=new int[col];
fill(rowsize,rowsize+col,0);
for(int i=0;i<term;i++)
rowsize[a.sarray[i].col]++;
rowstart=0;
for(int i=0;i<col;i++)
rowsize[i]=rowsize[i-1]+rowstart[i-1];
for(int i=0;i<terms;i++)
{
int j=rowstart[a.sarray[i].col];
b.sarray[j].row=a.sarray[i].col;
b.sarray[j].col=a.sarray[i].row;
b.sarray[j].value=a.sarray[i].value;
rowstart[a.sarray[i].col]++;
}
}
}