三对角矩阵压缩存储 转置
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验题目:
实验八——矩阵实验
程序设计2
问题分析:
1、题目要求:设计算法求三对角矩阵在压缩存储下的转置矩阵
2、设计思路:定义一种新的数据结构三元组用来存放数据,该数据结构为以一维数组,结点包括三个量i、j、v,i、j分别用来记录矩阵中元素的下标,v用来记录元素值,这样交换时,仅对下标交换即可达到转置矩阵的目的
3、输入与输出:只需输入三对角矩阵中所有非零元素的值,存放在三元组里,输出时,程序自动在没有数字元素处补零,以矩阵形式输出;
4、转置:调用转置函数进行转置,转置时仅交换数据的下标
5、测试数据:A、输入矩阵阶数:4
输入第一行的两个元素:1 2
输入第二、三行的元素,各三个:
4 5 6
7 8 9
输入最后一行的两个元素:3 8
预测结果:
原矩阵:转置后矩阵:
1 2 0 0 1 4 0 0
4 5 6 0 2 5 7 0
0 7 8 9 0 6 8 3
0 0 3 8 0 0 9 8
B、输入矩阵阶数:5
输入第一行的两个元素:12 45
输入第二、三行的元素,各三个:
77 88 99
44 55 66
11 22 33
输入最后一行的两个元素:14 82
预测结果:
原矩阵:转置后矩阵:
12 45 0 0 0 12 77 0 0 0
77 88 99 0 0 45 88 44 0 0
0 44 55 66 0 0 99 55 11 0
0 0 11 22 33 0 0 66 22 14
0 0 0 14 82 0 0 0 33 82
概要设计:
1、为了实现上述程序功能,需定义三元组数据结构用来存储数据,建立三元组输入函数,输出函数和矩阵转置函数,最后在屏幕上输出结果;
2、本程序包含4个函数:
⑴主函数main()
⑵三对焦矩阵建立函数Setmatrix()
⑶转置函数Trabsmatrix()
⑷输出函数Tsmatrixout()
各函数关系如下:
详细设计:
1、数据结构与结点类型:
typedef struct //定义结点类型
{
int i,j,v;
}node;
typedef struct //定义矩阵类型
{
node data[max];
int m;
}TSmatrix;
2、各函数的基本操作
⑴三对角矩阵的建立函数
TSmatrix *Setmatrix(){
申请空间;
输入第一行的两个元素;
输入2~n-1行的元素,每行3个;
返回;
}
⑵转置函数
TSmatrix *Trabsmatrix(TSmatrix *T){
建立新的三元组;
把原三元组数据下标交换,放入新组;
返回新三元组;
}
⑶输出函数
void TSmatrixout(TSmatrix *T){
定义变量a 、b=0;
如果三元表中数据下表等于a 、b 的值,则输出该元素;
否则,输出0;
a++’;b++;
}
main() Setmatrix() Trabsmatrix() Tsmatrixout()
源代码:
#include
#include
#define max 20
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("请输入矩阵阶数:");
scanf("%d",&T->m);
printf("建立三对角矩阵:\n");
printf("输入第一行的两个数:\n"); //第一行只有两个元素,单独输入 scanf("%d %d",&T->data[0].v,&T->data[1].v);
T->data[0].i=0;
T->data[0].j=0;
T->data[1].i=0;
T->data[1].j=1;
printf("输入第二行至第%d行的数(每行3个):\n",T->m-1);
int t=2;
for(int p=1;p
for(int q=p-1;q
{
T->data[t].j=q;
T->data[t].i=p;
scanf("%d",&T->data[t].v);
t++;
}
printf("输入最后一行的两个数:\n"); //输入最后一行的两个元素
scanf("%d %d",&T->data[3*T->m-4].v,&T->data[3*T->m-3].v);
T->data[3*T->m-4].i=T->m-1;
T->data[3*T->m-4].j=T->m-2;
T->data[3*T->m-3].i=T->m-1;
T->data[3*T->m-3].j=T->m-1;
return T;