//矩阵计算-化成行最简形式
#include <vector>
#include <iostream>
#include <cmath>
//化成行最简形式
class Matrix {
public:
// 使用二维向量直接构造矩阵
Matrix(std::vector<std::vector<double>> matrix)
: data(matrix), rows(matrix.size()), cols(matrix[0].size()) {}
void eliminate() {
// High-level view
for(int i = 0; i < std::min(rows, cols); ++i) {
// Find pivot
int max_row = i;
for(int k = i + 1; k < rows; k++) {
if(std::abs(data[k][i]) > std::abs(data[max_row][i]))
max_row = k;
}
std::swap(data[i], data[max_row]);
// Eliminate below pivot
for(int k = i + 1; k < rows; k++) {
double f = data[k][i] / data[i][i];
for(int l = i + 1; l < cols; l++)
data[k][l] -= data[i][l] * f;
// Fill with zeros as we go
data[k][i] = 0;
}
// Normalize pivot row
double f = data[i][i];
for(int k = i; k < cols; k++)
data[i][k] /= f;
}
}
void print() {
for(auto& row : data) {
for(auto val : row)
std::cout << val << " ";
std::cout << "\n";
}
}
private:
std::vector<std::vector<double>> data;
int rows, cols;
};
int main() {
std::vector<std::vector<double>> elements = {
{3, 0, -1, 0, 0},
{8, 0, 0, -2, 0},
{0, 2, -2, -1, 0}
};
Matrix matrix(elements);
matrix.eliminate();
matrix.print();
return 0;
}