Advertisement
Guest User

Untitled

a guest
Jun 21st, 2016
253
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.71 KB | None | 0 0
  1. bool Matrix::lu(std::vector<int> &p) {
  2.     p.resize(szi);
  3.     std::vector<int> pinv(szi);
  4.     for (int i = 0; i < szi; i++) {
  5.         p[i] = pinv[i] = i;
  6.     }
  7.  
  8.     for (int k = 0; k < szj; k++) {
  9.         double maxabs = -1;
  10.         int best_i = -1;
  11.         for (int i = k; i < szi; i++) {
  12.             if (abs(a[i][k]) > maxabs) {
  13.                 maxabs = abs(a[i][k]);
  14.                 best_i = i;
  15.             }
  16.         }
  17.  
  18.         static const double EPS = 1e-12;
  19.         if (maxabs < EPS) {
  20.             return false;
  21.         }
  22.  
  23.         std::swap(a[best_i], a[k]);
  24.         std::swap(p[pinv[best_i]], p[pinv[k]]);
  25.         std::swap(pinv[best_i], pinv[k]);
  26.        
  27.         for (int i = k + 1; i < szi; i++) {
  28.             a[i][k] /= maxabs;
  29.             for (int j = k + 1; j < szj; j++) {
  30.                 a[i][j] -= a[i][k] * a[k][j] ;
  31.             }
  32.         }
  33.     }
  34.  
  35.     return true;
  36. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement