算法流程
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()