求三角矩阵在压缩存储下的转置矩阵
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#include
#define max 20
#define zero 0
typedef struct{
int i,j,v;
}node;
typedef struct{
node data[max];
int m;
}TSmatrix;
TSmatrix *Setmatrix(){ //建三对角矩阵TSmatrix *T;
T=(TSmatrix
*)malloc(sizeof(TSmatrix));
printf("请输入矩阵行数或列数:\n");
scanf("%d",&T->m);
printf("建立三对角矩阵:\n");
for(int n=0;n<3*T->m-2;n++)
scanf("%d%d%d",&T->data[n].i,&T->dat a[n].j,&T->data[n].v);
return T;
}
TSmatrix *Trabsmatrix(TSmatrix *T){ //三对角矩阵转置
int n,k,temp;
TSmatrix *F;
F=(TSmatrix
*)malloc(sizeof(TSmatrix));
F->m=T->m;
for(n=0;n<3*T->m-2;n++){ //将结点信息存入新三元组表中
temp=2*T->data[n].j+T->data[n].i; //计算待存入三元数组下标
F->data[temp].i=T->data[n].j;
F->data[temp].j=T->data[n].i;
F->data[temp].v=T->data[n].v;
}
return F;
}
void TSmatrixout(TSmatrix *T){ //三对角矩阵输出
int a,b,n;
n=0;
for(a=0;a
for(b=0;b
if(T->data[n].i==a&&T->data[n].j==b){
printf("%-5d",T->data[n].v);
n++;
}
else
printf("%-5d",zero);
}
printf("\n");
}
}
void main(){
TSmatrix *T;
T=Setmatrix();
printf("三对角矩阵:\n");
TSmatrixout(T);
T=Trabsmatrix(T);
printf("转置后三对角矩阵:\n");
TSmatrixout(T);
}
问题分析:
本程序要求实现对压缩存储下的三对角矩阵进行转置,为实现上述功能,需要解决的关键问题是三对角矩阵压缩存储及转置过程。
概要设计:
利用三元组表以行序为主序压缩存储三对角矩阵。转置时,先利用三元数组中的行标i 和列标j计算出待放入新三元数组的下标temp。由于转置时需要将行标和列标交换,所以temp=2*j+i。找出待存入的下标后,将相应的信息存入下标为temp的三元数组中。
详细设计:
由于三元组表中的结点存放了元素的行标i和列标j,因此可利用行标和列标互换进行转置,但这样操作后,新三元组表中的元素则以列序为主序存放,不便矩阵遍历输出,因此在将互换行标、列标后的元素存入新三元组表时,应先计算出按行序为主序存放时所在的下标temp。
由于三对角矩阵元素存入三元数组中,所在的下标temp与其行标i和列标j有temp=2*i+j关系,所以可先求出下标temp,同时将信息存入下标为temp的数组中,所得的新三元组表即以行序为主序存放的。
调试分析及小结:
错误及分析:在开始设计转置函数时,直接利用行标和列标交换方法,因此所得的新三
元组表则以列序为主序存放,输出矩阵时并未正确的转置矩阵。
初步改进:参考课本的转置思想,对三元组表进行转置时,以列序为主序进行转置,转置后所得新三元组表则是以行序为主序存放,但该算法时间复杂度为O(n×t),其中n为列数,t为非0元个数。
最终改进:由于三对角矩阵元素存入三元数组中的下标temp与该元素的行标i与列标j 有temp=2*i+j关系,因此可直接将元素信息存放下标temp的数组中,该算法时间复杂度为O(t),t为非0元个数,程序代码如下:
for(n=0;n<3*T->m-2;n++){
temp=2*T->data[n].j+T->data[n].i;
F->data[temp].i=T->data[n].j;
F->data[temp].j=T->data[n].i;
F->data[temp].v=T->data[n].v;
}