12b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#include <iostream>
22b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct init {
32b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  init() { std::cout << "[" << "init" << "]" << std::endl; }
42b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
52b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginit init_obj;
62b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// [init]
72b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#include <iostream>
82b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#include <Eigen/Dense>
92b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangusing namespace std;
112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangusing namespace Eigen;
122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangint main()
142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  MatrixXd A(2,2);
162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  A << 2, -1, 1, 3;
172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  cout << "Here is the input matrix A before decomposition:\n" << A << endl;
182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangcout << "[init]" << endl;
192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangcout << "[declaration]" << endl;
212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  PartialPivLU<Ref<MatrixXd> > lu(A);
222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  cout << "Here is the input matrix A after decomposition:\n" << A << endl;
232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangcout << "[declaration]" << endl;
242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangcout << "[matrixLU]" << endl;
262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  cout << "Here is the matrix storing the L and U factors:\n" << lu.matrixLU() << endl;
272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangcout << "[matrixLU]" << endl;
282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangcout << "[solve]" << endl;
302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  MatrixXd A0(2,2); A0 << 2, -1, 1, 3;
312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  VectorXd b(2);    b << 1, 2;
322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  VectorXd x = lu.solve(b);
332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  cout << "Residual: " << (A0 * x - b).norm() << endl;
342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangcout << "[solve]" << endl;
352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangcout << "[modifyA]" << endl;
372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  A << 3, 4, -2, 1;
382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  x = lu.solve(b);
392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  cout << "Residual: " << (A0 * x - b).norm() << endl;
402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangcout << "[modifyA]" << endl;
412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangcout << "[recompute]" << endl;
432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  A0 = A; // save A
442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  lu.compute(A);
452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  x = lu.solve(b);
462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  cout << "Residual: " << (A0 * x - b).norm() << endl;
472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangcout << "[recompute]" << endl;
482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangcout << "[recompute_bis0]" << endl;
502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  MatrixXd A1(2,2);
512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  A1 << 5,-2,3,4;
522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  lu.compute(A1);
532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  cout << "Here is the input matrix A1 after decomposition:\n" << A1 << endl;
542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangcout << "[recompute_bis0]" << endl;
552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangcout << "[recompute_bis1]" << endl;
572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  x = lu.solve(b);
582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  cout << "Residual: " << (A1 * x - b).norm() << endl;
592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangcout << "[recompute_bis1]" << endl;
602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}
62