def _geneig(a1,b,left,right,overwrite_a,overwrite_b): b1 = asarray(b) overwrite_b = overwrite_b or (b1 is not b and not hasattry(b,'__array__')) if len(b1.shape) != 2 or b1.shape[0] != b1.shape[1]: raise ValueError, 'expected square matrix' ggev, = get_lapack_funcs(('ggev',),(a1,b1)) cvl,cvr = left,right if ggev.module_name[:7] == 'clapack': raise NotImplementedError,'calling ggev from %s' % (ggev.module_name) res = ggev(a1,b1,lwork=-1) lwork = res[-2][0] if ggev.prefix in 'cz': alpha,beta,vl,vr,work,info = ggev(a1,b1,cvl,cvr,lwork, overwrite_a,overwrite_b) w = alpha / beta else: alphar,alphai,beta,vl,vr,work,info = ggev(a1,b1,cvl,cvr,lwork, overwrite_a,overwrite_b) w = (alphar+_I*alphai)/beta if info<0: raise ValueError,\ 'illegal value in %-th argument of internal ggev'%(-info) if info>0: raise LinAlgError,"generalized eig algorithm did not converge" only_real = scipy_base.logical_and.reduce(scipy_base.equal(w.imag,0.0)) if not (ggev.prefix in 'cz' or only_real): t = w.typecode() if left: vl = _make_complex_eigvecs(w, vl, t) if right: vr = _make_complex_eigvecs(w, vr, t) if not (left or right): return w if left: if right: return w, vl, vr return w, vl return w, vr
def eig(a,b=None,left=0,right=1,overwrite_a=0,overwrite_b=0): """ Solve ordinary and generalized eigenvalue problem of a square matrix. Inputs: a -- An N x N matrix. b -- An N x N matrix [default is identity(N)]. left -- Return left eigenvectors [disabled]. right -- Return right eigenvectors [enabled]. Outputs: w -- eigenvalues [left==right==0]. w,vr -- w and right eigenvectors [left==0,right=1]. w,vl -- w and left eigenvectors [left==1,right==0]. w,vl,vr -- [left==right==1]. Definitions: a * vr[:,i] = w[i] * b * vr[:,i] a^H * vl[:,i] = conjugate(w[i]) * b^H * vl[:,i] where a^H denotes transpose(conjugate(a)). """ a1 = asarray_chkfinite(a) if len(a1.shape) != 2 or a1.shape[0] != a1.shape[1]: raise ValueError, 'expected square matrix' overwrite_a = overwrite_a or (a1 is not a and not hasattr(a,'__array__')) if b is not None: b = asarray_chkfinite(b) return _geneig(a1,b,left,right,overwrite_a,overwrite_b) geev, = get_lapack_funcs(('geev',),(a1,)) compute_vl,compute_vr=left,right if geev.module_name[:7] == 'flapack': lwork = calc_lwork.geev(geev.prefix,a1.shape[0], compute_vl,compute_vr)[1] if geev.prefix in 'cz': w,vl,vr,info = geev(a1,lwork = lwork, compute_vl=compute_vl, compute_vr=compute_vr, overwrite_a=overwrite_a) else: wr,wi,vl,vr,info = geev(a1,lwork = lwork, compute_vl=compute_vl, compute_vr=compute_vr, overwrite_a=overwrite_a) t = {'f':'F','d':'D'}[wr.typecode()] w = wr+_I*wi else: # 'clapack' if geev.prefix in 'cz': w,vl,vr,info = geev(a1, compute_vl=compute_vl, compute_vr=compute_vr, overwrite_a=overwrite_a) else: wr,wi,vl,vr,info = geev(a1, compute_vl=compute_vl, compute_vr=compute_vr, overwrite_a=overwrite_a) t = {'f':'F','d':'D'}[wr.typecode()] w = wr+_I*wi if info<0: raise ValueError,\ 'illegal value in %-th argument of internal geev'%(-info) if info>0: raise LinAlgError,"eig algorithm did not converge" only_real = scipy_base.logical_and.reduce(scipy_base.equal(w.imag,0.0)) if not (geev.prefix in 'cz' or only_real): t = w.typecode() if left: vl = _make_complex_eigvecs(w, vl, t) if right: vr = _make_complex_eigvecs(w, vr, t) if not (left or right): return w if left: if right: return w, vl, vr return w, vl return w, vr