docs: public double[][] denoise(double mat[][], int iter) {
          img_org = new double[width][height];
          double img_res[][] = new double[width][height];
          double l_currentNum;
          double l_currentDen;
          int val = 1;
          double lam = 0;
          double dt = 0.4;
  
  
          img_org = mat;
  
          //Perform iterations
  
          for (int it = 0; it < iter; it++) {
              //compute derivatives
              img_x = diff_x(mat);
              img_y = diff_y(mat);
              img_xx = diff_xx(mat);
              img_yy = diff_yy(mat);
              img_xy = diff_xy(mat);
  
              for (int i = 0; i < width; i++) {
                  for (int j = 0; j < height; j++) {
                      double a = img_xx[i][j] * (val + Math.pow(img_y[i][j], 2));
                      double b = (2 * img_x[i][j] * img_y[i][j] * img_xy[i][j]);
                      double c = (img_yy[i][j] * (val + Math.pow(img_x[i][j], 2)));
                      l_currentNum = a - b + c;
                      l_currentDen = Math.pow((val + Math.pow(img_x[i][j], 2) + Math.pow(img_y[i][j], 2)), (1.5));
                      img_res[i][j] = (l_currentNum / l_currentDen) + lam * (img_org[i][j] - mat[i][j]);
                      mat[i][j] = mat[i][j] + dt * img_res[i][j];//evolve image by dt.
                  }
              }
  
          }// end of iterations.
          return mat;
      }