- 实验要求:
矩阵运算:根据两个4阶三角矩阵的压缩存储,计算两个矩阵相加之和,并将结果存入一个新的矩阵C中。
假设两种情况:两个(上)下三角矩阵求和
一个上(下)三角和一个下(上)三角求和
如果是两个上(下)三角矩阵求和,依然使用压缩存储求和即可。
如果是一个上(下)三角矩阵和一个下(上)三角矩阵求和,可将两矩阵复原再求和
- 实例:
实验代码
#include<stdio.h>
#include<stdlib.h>
#define M 4
#define N 4
/*
上三角矩阵;
k=(n+(n-i+1))*i/2+(j-i); (i<=j)
k=n*(n+1)/2; (i>j)
*/
/*
下三角矩阵
k=i*(i+1)/2+j; (i>=j)
k=n*(n+1)/2; (i<j)
*/
void input(int a[4][4]) //输入矩阵
{
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
scanf("%d",&a[i][j]);
}
}
}
void yasuo_xia(int z[11],int a[4][4]) //压缩下三角矩阵
{
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
if(i>=j)
{
z[i*(i+1)/2+j]=a[i][j];
}
else
{
z[M*(M+1)/2]=a[i][j];
}
}
}
}
void yasuo_shang(int z[11],int a[4][4]) //压缩上三角矩阵
{
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
if(i<=j)
{
z[(M+(M-i+1))*i/2+(j-i)]=a[i][j];
}
else
{
z[M*(M+1)/2]=a[i][j];
}
}
}
}
void array1_add(int a[11],int b[11],int c[11]) //把数组a 数组b 相加后结果放入矩阵c中
{
for(int i=0;i<11;i++)
{
c[i]=a[i]+b[i];
}
}
void array2_add(int a[4][4],int b[4][4],int c[4][4]) //把矩阵a 矩阵b 相加后放入矩阵c中。
{
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
c[i][j]=a[i][j]+b[i][j];
}
}
}
void print(int a[4][4]) //打印输出矩阵
{
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
printf("%d\t",a[i][j]);
}
printf("\n");
}
}
void xia_huanyuan(int m[4][4],int n[11]) //把压缩矩阵还原为下三角矩阵
{
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
if(i>=j)
{
m[i][j]=n[i*(i+1)/2+j];
}
else
{
m[i][j]=n[M*(M+1)/2];
}
}
}
}
void shang_huanyuan(int m[4][4],int n[11]) //把压缩矩阵还原为上三角矩阵
{
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
if(i<=j)
{
m[i][j]=n[(M+(M-i+1))*i/2+(j-i)];
}
else
{
m[i][j]=n[M*(M+1)/2];
}
}
}
}
int main()
{
int m[4][4]; //两个下三角矩阵的测试
input(m);
printf("****************\n");
int n[4][4];
input(n);
printf("****************\n");
int p[11],q[11];
yasuo_xia(p,m);
yasuo_xia(q,n);
int k[11];
array1_add(p,q,k);
int l[4][4];
xia_huanyuan(l,k);
print(l);
printf("****************\n");
printf("\n");
printf("\n");
printf("\n");
int f[4][4],g[4][4],j[11],x[11]; //一个下三角与一个上三角的测试
input(f);
printf("****************\n");
input(g);
printf("****************\n");
yasuo_shang(j,f);
yasuo_shang(x,g);
int y[4][4],z[4][4],s[4][4];
shang_huanyuan(y,j);
shang_huanyuan(z,x);
array2_add(y,z,s);
print(s);
printf("****************\n");
return 0;
}
实验截图: