docs: public static DMatrixRMaj nullSpace(SingularValueDecomposition_F64<DMatrixRMaj> svd ,
                                            DMatrixRMaj nullSpace , double tol )
      {
          int N = svd.numberOfSingularValues();
          double s[] = svd.getSingularValues();
  
          DMatrixRMaj V = svd.getV(null,true);
  
          if( V.numRows != svd.numCols() ) {
              throw new IllegalArgumentException("Can't compute the null space using a compact SVD for a matrix of this size.");
          }
  
          // first determine the size of the null space
          int numVectors = svd.numCols()-N;
  
          for( int i = 0; i < N; i++ ) {
              if( s[i] <= tol ) {
                  numVectors++;
              }
          }
  
          // declare output data
          if( nullSpace == null ) {
              nullSpace = new DMatrixRMaj(numVectors,svd.numCols());
          } else {
              nullSpace.reshape(numVectors,svd.numCols());
          }
  
          // now extract the vectors
          int count = 0;
          for( int i = 0; i < N; i++ ) {
              if( s[i] <= tol ) {
                  CommonOps_DDRM.extract(V, i,i+1,0, V.numCols,nullSpace,count++,0);
              }
          }
          for( int i = N; i < svd.numCols(); i++ ) {
              CommonOps_DDRM.extract(V, i,i+1,0, V.numCols,nullSpace,count++,0);
          }
  
          CommonOps_DDRM.transpose(nullSpace);
  
          return nullSpace;
      }