通过下列代码解释:
这么说吧,刚开始我也不是很理解。在经过一段时间研究后才枉然大悟。
1.首先说下,在以三元组表的形式存矩阵元素时。如果是以行向量来存的话,在输入与输出时,同一行中的数据,列不一定按顺序来。但行必须从上到下。
2.所以按照上面的规则,如果按一般思路,之所以不能直接行,列交换是因为直接交换后,行的顺序一般是乱的,在输出时就没有办法输出正确的矩阵。所以一般方法就得从第一列一直遍历到最后一列,每一列都要遍历全部来保证顺序。
3.而在快速转置的方法中 cpot【】保存的是正确的行序,所以可以直接行,列值交换而不会破坏行序
TSMatrix* TransTSMatrix_plus(TSMatrix* M)
{
TSMatrix* T;
T = (TSMatrix*)malloc(sizeof(TSMatrix));
T->tu = M->tu;
T->mu = M->nu;
T->nu = M->mu;//这三部是矩阵的行,列值交换,不用多说了
int num[max] = {};//记住每一列中非零元素个数
int cpot[max] = {};//每一列第一个非零元素的正确位置
for (int p = 0; p < M->tu; p++)
++num[M->data[p].j];//巧妙求非零元素个数
for (int p = 1; p < M->tu; p++)
cpot[p] = cpot[p - 1] + num[p - 1];
for (int p = 0; p < M->tu; p++)
{
int col = M->data[p].j;
int q = cpot[col];
T->data[q].i = M->data[p].j;
T->data[q].j = M->data[p].i;
T->data[q].data = M->data[p].data;
++cpot[col];
}
return T;
}