[Scipy-svn] r4115 - trunk/scipy/sparse/linalg/eigen/lobpcg
scipy-svn@scip...
scipy-svn@scip...
Tue Apr 8 09:46:59 CDT 2008
Author: rc
Date: 2008-04-08 09:46:52 -0500 (Tue, 08 Apr 2008)
New Revision: 4115
Modified:
trunk/scipy/sparse/linalg/eigen/lobpcg/info.py
trunk/scipy/sparse/linalg/eigen/lobpcg/lobpcg.py
Log:
lobpcg fixes
Modified: trunk/scipy/sparse/linalg/eigen/lobpcg/info.py
===================================================================
--- trunk/scipy/sparse/linalg/eigen/lobpcg/info.py 2008-04-08 13:55:37 UTC (rev 4114)
+++ trunk/scipy/sparse/linalg/eigen/lobpcg/info.py 2008-04-08 14:46:52 UTC (rev 4115)
@@ -63,10 +63,10 @@
The LOBPCG code internally solves eigenproblems of the size 3``m`` on every
iteration by calling the "standard" dense eigensolver, so if ``m`` is not
small enough compared to ``n``, it does not make sense to call the LOBPCG
-code, but rather one should use the "standard" eigensolver, e.g. symeig
+code, but rather one should use the "standard" eigensolver, e.g. scipy or symeig
function in this case. If one calls the LOBPCG algorithm for 5``m``>``n``,
-it will most likely break internally, so the code tries to call symeig
-instead.
+it will most likely break internally, so the code tries to call the standard
+function instead.
It is not that n should be large for the LOBPCG to work, but rather the
ratio ``n``/``m`` should be large. It you call the LOBPCG code with ``m``=1
Modified: trunk/scipy/sparse/linalg/eigen/lobpcg/lobpcg.py
===================================================================
--- trunk/scipy/sparse/linalg/eigen/lobpcg/lobpcg.py 2008-04-08 13:55:37 UTC (rev 4114)
+++ trunk/scipy/sparse/linalg/eigen/lobpcg/lobpcg.py 2008-04-08 14:46:52 UTC (rev 4115)
@@ -39,7 +39,10 @@
else:
fun = ll.get_lapack_funcs( ['sygv'], arrays = (mtxA,) )[0]
## print fun
- w, v, info = fun( mtxA, mtxB )
+ if mtxB is None:
+ out = fun( mtxA )
+ else:
+ out = fun( mtxA, mtxB )
## print w
## print v
## print info
@@ -51,14 +54,13 @@
ii = nm.argsort( w )
w = w[slice( *select )]
if eigenvectors:
- v = out[1][:,ii]
- v = v[:,slice( *select )]
+ v = out[1][:,ii]
+ v = v[:,slice( *select )]
+ out = w, v, 0
+ else:
+ out = w, 0
- if eigenvectors:
- out = w, v
- else:
- out = w
- return out
+ return out[:-1]
def pause():
raw_input()
@@ -549,6 +551,7 @@
precond = spdiags( ivals, 0, n, n )
# precond = None
tt = time.clock()
+# B = None
eigs, vecs = lobpcg( X, A, B, blockVectorY = Y,
M = precond,
residualTolerance = 1e-4, maxIterations = 40,
More information about the Scipy-svn
mailing list