#include <iostream>
void LUDecRes(double **A, int Row, int Col, double *B, double *res){
int row = Row;
int col = Col + 1;
double **L, **U, **Ar;
L = new double*[row];
U = new double*[row];
Ar = new double*[row];
for(int i = 0; i < row; ++i){
L[i] = new double[row];
U[i] = new double[col];
Ar[i] = new double[col];
for(int j = 0; j < row; ++j)
Ar[i][j] = A[i][j];
Ar[i][col - 1] = B[i];
}
for(int i = 0; i < row; ++i){
U[i][i] = 1;
L[i][i] = 0;
L[i][0] = Ar[i][0];
U[0][i + 1] = Ar[0][i + 1] / L[0][0];
}
for(int i = 1; i < row; ++i){
for(int j = i; j < row; ++j){
double sum = 0;
for(int c = 0; c < i; ++c)
sum += L[j][c]*U[c][i];
L[j][i] = Ar[j][i] - sum;
sum = 0;
for(int c = 0; c < i; ++c)
sum += L[i][c]*U[c][j + 1];
U[i][j + 1] = ( Ar[i][j + 1] - sum ) / L[i][i];
}
}
for(int i = row - 2; i >= 0; --i){
double sum = 0;
for(int c = i + 1; c < row; ++c)
sum += U[i][c]*U[c][row];
U[i][row] -= sum;
}
for(int i = 0; i < row; ++i)
res[i] = U[i][row];
for(int i = 0; i < row; ++i){
delete[] L[i];
delete[] U[i];
delete[] Ar[i];
}
delete[] L;
delete[] U;
delete[] Ar;
}
int main(){
double arr_v[3] = {7, 4, 6};
double arr_m[3][3] =
{
{10,-7, 0},
{-3, 2, 6},
{ 5,-2, 5}
};
double *arrV, *res, **arrM;
arrV = new double[3];
res = new double[3];
arrM = new double*[3];
for(int i = 0; i < 3; ++i){
arrM[i] = new double[3];
arrV[i] = arr_v[i];
for(int j = 0; j < 3; ++j)
arrM[i][j] = arr_m[i][j];
}
LUDecRes(arrM, 3, 3, arrV, res);
std::cout << "``Result`` : ";
for(int i = 0; i < 3; ++i)
std::cout << res[i] << ' ';
std::cout << std::endl;
for(int i = 0; i < 3; ++i)
delete[] arrM[i];
delete[] arrM;
delete[] arrV;
delete[] res;
return 0;
}