#include<iostream>
#include<vector>
typedef std::vector<std::vector<double>> Matrix;
typedef std::vector<double> Line;
Matrix getLsf(Matrix A, Matrix B);
Matrix T(Matrix matrix);
Matrix operator*(const Matrix A, const Matrix B);
Matrix Inverse(Matrix matrix);
void PrinfM(Matrix matrix);
void PrinfM(Matrix matrix) {
for (int i = 0; i < matrix.size(); i++) {
for (int j = 0; j < matrix[i].size(); j++) {
std::cout << matrix[i][j] << '\t';
}
std::cout << std::endl;
std::cout << std::endl;
}
}
Matrix getLsf(Matrix A, Matrix B) {
Matrix TA = T(A) * A;
Matrix ATB = T(A) * B;
Matrix X = Inverse(TA) * ATB;//A-1
return X;
}
Matrix T(Matrix matrix) {
Matrix matrixT;
for (int i = 0; i < matrix[0].size(); ++i) {
std::vector<double> value;
for (int j = 0; j < matrix.size(); ++j) {
value.push_back(matrix[j][i]);
}
matrixT.push_back(value);
}
return matrixT;
}
Matrix operator*(const Matrix A, const Matrix B) {
Matrix result;
for (int i = 0; i < A.size(); ++i) {
Line line;
for (int j = 0; j < B[0].size(); ++j) {
float value=0;
for (int k = 0; k < B.size(); ++k) {
value += A[i][k] * B[k][j];
}
line.push_back(value);
}
result.push_back(line);
}
return result;
}
Matrix Inverse(Matrix matrix) {
double value = 1 / (matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0]);
double temp = matrix[0][0];
matrix[0][0] = matrix[1][1];
matrix[1][1] = temp;
matrix[0][1] = -matrix[0][1];
matrix[1][0] = -matrix[1][0];
for (int i = 0; i < matrix.size(); ++i) {
for (int j = 0; j < matrix[i].size(); ++j) {
matrix[i][j] *= value;
std::cout << matrix[i][j] << "," ;
}
std::cout << std::endl;
}
return matrix;
}