def eig(a, left:false, right:true)
    jobvl, jobvr = left, right
    case blas_char(a)
    when /c|z/
      w, vl, vr, info = Lapack.call(:geev, a, jobvl:jobvl, jobvr:jobvr)
    else
      wr, wi, vl, vr, info = Lapack.call(:geev, a, jobvl:jobvl, jobvr:jobvr)
      w  = wr + wi * Complex::I
      vl = _make_complex_eigvecs(w,vl) if left
      vr = _make_complex_eigvecs(w,vr) if right
    end
    [w,vl,vr] #.compact
  end
def eig(a, left:false, right:true)
    jobvl, jobvr = left, right
    case blas_char(a)
    when /c|z/
      w, vl, vr, info = Lapack.call(:geev, a, jobvl:jobvl, jobvr:jobvr)
    else
      wr, wi, vl, vr, info = Lapack.call(:geev, a, jobvl:jobvl, jobvr:jobvr)
      w  = wr + wi * Complex::I
      vl = _make_complex_eigvecs(w,vl) if left
      vr = _make_complex_eigvecs(w,vr) if right
    end
    [w,vl,vr] #.compact
  end
Matrix eigenvalues
 Computes the eigenvalues and, optionally, the left and/or right
 eigenvectors for a square nonsymmetric matrix A.

 @param a [Numo::NArray] square nonsymmetric matrix (>= 2-dimensinal NArray)
 @param left [Bool] (optional) If true, left eigenvectors are computed.
 @param right [Bool] (optional) If true, right eigenvectors are computed.
 @return [[w,vl,vr]]
   - **w**  [Numo::NArray] -- The eigenvalues.
   - **vl** [Numo::NArray] -- The left eigenvectors if left is true, otherwise nil.
   - **vr** [Numo::NArray] -- The right eigenvectors if right is true, otherwise nil.