#include <iostream>
#include <vector>
using namespace std;
void lu_decomposition(const std::vector<std::vector<double> > &vals)
{
int i = 0, j = 0, k = 0;
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
if (j < i)
l[j][i] = 0;
else
{
l[j][i] = vals[j][i];
for (k = 0; k < i; k++)
{
l[j][i] = l[j][i] - l[j][k] * u[k][i];
}
}
}
for (j = 0; j < n; j++)
{
if (j < i)
u[i][j] = 0;
else if (j == i)
u[i][j] = 1;
else
{
u[i][j] = vals[i][j] / l[i][i];
for (k = 0; k < i; k++)
{
u[i][j] = u[i][j] - ((l[i][k] * u[k][j]) / l[i][i]);
}
}
}
}
}
int main() {
// your code goes here
std::vector<std::vector<double> > data = {
{5, 2, 1, 12, 8},
{1, 4, 3, 4, 5},
{7, 4, 1, 7, 2},
{7, 8, 6, 4, 1},
{8, 1, 2, 3, 5},
};
std::vector<std::vector<double> > l(5, std::vector<double>(5));
std::vector<std::vector<double> > u(5, std::vector<double>(5));
int n = 5;
lu_decomposition(data, l, u);
std::cout << "U" << std::endl;
for(unsigned i = 0; (i < n); i++)
{
for(unsigned j=0; (j < n); j++)
{
std::cout << u[i][j] << ' ';
}
std::cout << std::endl;
}
std::cout << std::endl;
std::cout << "L" << std::endl;
for(unsigned i = 0; (i < n); i++)
{
for(unsigned j=0; (j < n); j++)
{
std::cout << l[i][j] << ' ';
}
std::cout << std::endl;
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnZvaWQgbHVfZGVjb21wb3NpdGlvbihjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3Rvcjxkb3VibGU+ID4gJnZhbHMpCnsKCiAgICBpbnQgaSA9IDAsIGogPSAwLCBrID0gMDsKICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCiAgICB7CiAgICAgICAgZm9yIChqID0gMDsgaiA8IG47IGorKykKICAgICAgICB7CiAgICAgICAgICAgIGlmIChqIDwgaSkKICAgICAgICAgICAgICAgIGxbal1baV0gPSAwOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGxbal1baV0gPSB2YWxzW2pdW2ldOwogICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IGk7IGsrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBsW2pdW2ldID0gbFtqXVtpXSAtIGxbal1ba10gKiB1W2tdW2ldOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvciAoaiA9IDA7IGogPCBuOyBqKyspCiAgICAgICAgewogICAgICAgICAgICBpZiAoaiA8IGkpCiAgICAgICAgICAgICAgICB1W2ldW2pdID0gMDsKICAgICAgICAgICAgZWxzZSBpZiAoaiA9PSBpKQogICAgICAgICAgICAgICAgdVtpXVtqXSA9IDE7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdVtpXVtqXSA9IHZhbHNbaV1bal0gLyBsW2ldW2ldOwogICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IGk7IGsrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB1W2ldW2pdID0gdVtpXVtqXSAtICgobFtpXVtrXSAqIHVba11bal0pIC8gbFtpXVtpXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCmludCBtYWluKCkgewoJLy8geW91ciBjb2RlIGdvZXMgaGVyZQoJCglzdGQ6OnZlY3RvcjxzdGQ6OnZlY3Rvcjxkb3VibGU+ID4gZGF0YSA9IHsKCQkKCQl7NSwgMiwgMSwgMTIsIDh9LAogICAgCXsxLCA0LCAzLCA0LCA1fSwKICAgIAl7NywgNCwgMSwgNywgMn0sCiAgICAJezcsIDgsIDYsIDQsIDF9LAogICAgCXs4LCAxLCAyLCAzLCA1fSwKCX07CglzdGQ6OnZlY3RvcjxzdGQ6OnZlY3Rvcjxkb3VibGU+ID4gbCg1LCBzdGQ6OnZlY3Rvcjxkb3VibGU+KDUpKTsgCglzdGQ6OnZlY3RvcjxzdGQ6OnZlY3Rvcjxkb3VibGU+ID4gdSg1LCBzdGQ6OnZlY3Rvcjxkb3VibGU+KDUpKTsKCQoJaW50IG4gPSA1OyAKCQoJbHVfZGVjb21wb3NpdGlvbihkYXRhLCBsLCB1KTsKCQoJCiAgICBzdGQ6OmNvdXQgPDwgIlUiIDw8IHN0ZDo6ZW5kbDsKICAgIGZvcih1bnNpZ25lZCBpID0gMDsgKGkgPCBuKTsgaSsrKQogICAgewogICAgCWZvcih1bnNpZ25lZCBqPTA7IChqIDwgbik7IGorKykKICAgIAl7CiAgICAJCXN0ZDo6Y291dCA8PCB1W2ldW2pdIDw8ICcgJzsKICAgIAl9CQogICAgCXN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7CiAgICB9CiAgICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwogICAgc3RkOjpjb3V0IDw8ICJMIiA8PCBzdGQ6OmVuZGw7CiAgICAgIGZvcih1bnNpZ25lZCBpID0gMDsgKGkgPCBuKTsgaSsrKQogICAgewogICAgCWZvcih1bnNpZ25lZCBqPTA7IChqIDwgbik7IGorKykKICAgIAl7CiAgICAJCXN0ZDo6Y291dCA8PCBsW2ldW2pdIDw8ICcgJzsKICAgIAl9CQogICAgCXN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7CiAgICB9Cn0KCg==