code: public static boolean isUnitary(ZMatrixRMaj Q , double tol ) {
          if( Q.numRows < Q.numCols ) {
              throw new IllegalArgumentException("The number of rows must be more than or equal to the number of columns");
          }
  
          Complex_F64 prod = new Complex_F64();
  
          ZMatrixRMaj u[] = CommonOps_ZDRM.columnsToVector(Q, null);
  
          for( int i = 0; i < u.length; i++ ) {
              ZMatrixRMaj a = u[i];
  
              VectorVectorMult_ZDRM.innerProdH(a, a, prod);
  
              if( Math.abs(prod.real-1) > tol)
                  return false;
              if( Math.abs(prod.imaginary) > tol)
                  return false;
  
              for( int j = i+1; j < u.length; j++ ) {
                  VectorVectorMult_ZDRM.innerProdH(a, u[j], prod);
  
                  if( !(prod.getMagnitude2() <= tol*tol))
                      return false;
              }
          }
  
          return true;
      }
docs: <p>
  Unitary matrices have the following properties:<br><br>
  Q*Q<sup>H</sup> = I
  </p>
  <p>
  This is the complex equivalent of orthogonal matrix.
  </p>
  @param Q The matrix being tested. Not modified.
  @param tol Tolerance.
  @return True if it passes the test.