-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmain.c
104 lines (96 loc) · 2.24 KB
/
main.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <stdio.h>
#include <stdlib.h>
void multi1(double A[n][e], double X[e][m], double AB[n][m], int n, int e, int m)//返回当前解带入A矩阵后的值
{
int i,j,k;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
for(k=0;k<e;k++)
{
AX[i][j]=AX[i][j]+A[i][k]*X[k][j];
}
}
}
}
void multi2(double A[n][m] doubl A2[m][m], int n, int m) //(m*n)*(n*m)矩阵转置乘矩阵
{
int i,j,k;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
for(k=0;k<n;k++)
{
A2[i][j]=A2[i][j]+A[k][i]*A[k][j];
}
}
}
}
void inverse (double A[][], double Ainverse[][])
int main()//需提前定义一个nm数组来存储当前解带入A矩阵后的值
//初始化 A B R
{
double R[][], P[][];
int i,j,k;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
R[i][j]=AX[i][j]-B[i][j];//初始残差
P[i][j]=R[i][j];
}
while(1)
{
if//不满足迭代结束条件
break
else
multi2(R,Rsqu1,n,m);//残差Rk的平方 mm
multi1(A,P,AP,n,n,m);//求得Ap
multi1(PT,AP,PAP,m,n,m);
inverse(PAP,PAP1);//mm
multi1(PAP1,Rsqu1,alpha,m,m,m);//步长alpha
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
q=0;
for(k=0;k<m;k++)
{
q=q+P[i][k]*alpha[k][j];
}
X[i][j]=X[i][j]+q;
}
}//更新解X
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
q=0;
for(k=0;k<m;k++)
{
q=q+AP[i][k]*alpha[k][j];
}
R[i][j]=R[i][j]-q;
}
}//更新R
//声明一个矩阵存beta
inverse(Rsqu1,RsquInver);
multi2(R,Rsqu2,n,m);//残差Rk+1的平方 mm
multi1(RsquInver,Rsqu2,beta);
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
q=0;
for(k=0;k<m;k++)
{
q=q+P[i][k]*beta[k][j];
}
P[i][j]=R[i][j]+q;
}
}//更新P
}
// 打印输出1
return 0;
}