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;
}
矩阵的快速转置
最新推荐文章于 2024-06-17 21:54:57 发布