求三角矩阵在压缩存储下的转置矩阵

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;am;a++){

for(b=0;bm;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;

}

相关文档
最新文档