算法流程
G-J 消元法通过这样的方法来进行初等变换:在每一个循环过程中,先寻找到主元,并将主元通过行变换 (无需列变换) 移动到矩阵的主对角线上, 然后将主元所在的行内的所有元素除以主元,使得主元化为 1;然后观察主元所在的列上的其他元素,将它们所在的行减去主元所在的行乘以一定的倍数, 使得主元所在的列内、 除主元外的其他元素化为 0,这样就使得主元所在的列化为了单位矩阵的形式。 这就是一个循环内做的工作。 然后, 在第二轮循环的过程中, 不考虑上一轮计算过程中主元所在的行和列内的元素, 在剩下的矩阵范围内寻找主元, 然后(如果其不在主对角线上的话) 将其移动到主对角线上, 并再次进行列的处理, 将列化为单位矩阵的形式。 余下的步骤依此类推。
C++代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<int, int> PII;
const int N = 1e3 + 10;
double a[N][N];
int n, m;
void test()
{
printf("经过变换的矩阵为:\n");
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
cout << a[i][j] << " ";
puts("");
}
}
void GJE()
{
for (int i = 0; i < n; i++)
{
double t = a[i][i];
for (int j = 0; j < m; j++)
{
a[i][j] /= t;
}
for (int j = 0; j < n; j++)
{
if (j == i)
continue;
double t = a[j][i] / a[i][i];
for (int k = 0; k < m; k++)
a[j][k] -= a[i][k] * t;
}
}
}
signed main()
{
cin >> n >> m;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
cin >> a[i][j];
GJE();
test();
return 0;
}
/*
3 4
2 2 6 4
2 1 7 6
-2 -6 -7 -1
*/
python代码
class gauss:
def __init__(self, M, nn, mm):
self.Matrix = M
self.n = nn
self.m = mm
def solve(self):
for i in range(0,self.n):
t = self.Matrix[i][i]
for j in range(0,self.m):
self.Matrix[i][j]=self.Matrix[i][j]/t
for j in range(0,self.n):
if j == i:
continue
tmp = self.Matrix[j][i] /self.Matrix[i][i]
for k in range(0,self.m):
self.Matrix[j][k] = self.Matrix[j][k] - self.Matrix[i][k]*tmp
for j in range(0, self.m - 1):
print(self.Matrix[self.n-1][i], end=' ')
def main():
n,m=map(int, input().split())
line = [[0] * m] * n
for i in range(n):
line[i] = input().split(" ")
line[i] = list(map(int,line[i]))
G = gauss(line,n,m)
G.solve()
main()