code: @Override
      public Matrix[] decompose() {
  
          Matrix[] lup = super.decompose();
          Matrix lu = lup[0];
          Matrix p = lup[1];
  
          Matrix l = matrix.blankOfShape(lu.rows(), lu.columns());
  
          for (int i = 0; i < l.rows(); i++) {
              for (int j = 0; j <= i; j++) {
                  if (i > j) {
                      l.set(i, j, lu.get(i, j));
                  } else {
                      l.set(i, j, 1.0);
                  }
              }
          }
  
          Matrix u = matrix.blankOfShape(lu.columns(), lu.columns());
  
          for (int i = 0; i < u.rows(); i++) {
              for (int j = i; j < u.columns(); j++) {
                  u.set(i, j, lu.get(i, j));
              }
          }
  
          return new Matrix[] { l, u, p };
      }
docs: Returns the result of LU decomposition of given matrix
  <p>
  See <a href="http://mathworld.wolfram.com/LUDecomposition.html">
  http://mathworld.wolfram.com/LUDecomposition.html</a> for more details.
  </p>
  
  @return { L, U, P }