- 實驗要求:
矩陣運算:根據兩個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;
}
實驗截圖: