docs: public void decompose( DMatrixRMaj A ) {
  
          Equation eq = new Equation();
  
          this.QR = A.copy();
  
          int N = Math.min(A.numCols,A.numRows);
  
          gammas = new double[ A.numCols ];
  
          for( int i = 0; i < N; i++ ) {
              // update temporary variables
              eq.alias(QR.numRows-i,"Ni",QR,"QR",i,"i");
  
              // Place the column that should be zeroed into v
              eq.process("v=QR(i:,i)");
              eq.process("maxV=max(abs(v))");
  
              // Note that v is lazily created above.  Need direct access to it, which is done below.
              DMatrixRMaj v = eq.lookupDDRM("v");
  
              double maxV = eq.lookupDouble("maxV");
              if( maxV > 0 && v.getNumElements() > 1 ) {
                  // normalize to reduce overflow issues
                  eq.process("v=v/maxV");
  
                  // compute the magnitude of the vector
                  double tau = NormOps_DDRM.normF(v);
  
                  if( v.get(0) < 0 )
                      tau *= -1.0;
  
                  eq.alias(tau,"tau");
                  eq.process("u_0 = v(0,0)+tau");
                  eq.process("gamma = u_0/tau");
                  eq.process("v=v/u_0");
                  eq.process("v(0,0)=1");
                  eq.process("QR(i:,i:) = (eye(Ni) - gamma*v*v')*QR(i:,i:)");
                  eq.process("QR(i:,i) = v");
                  eq.process("QR(i,i) = -1*tau*maxV");
  
                  // save gamma for recomputing Q later on
                  gammas[i] = eq.lookupDouble("gamma");
              }
          }
      }