[Scipy-svn] r6273 - trunk/scipy/sparse/linalg/eigen/arpack
scipy-svn at scipy.org
scipy-svn at scipy.org
Fri Mar 26 01:35:35 EDT 2010
Author: cdavid
Date: 2010-03-26 00:35:35 -0500 (Fri, 26 Mar 2010)
New Revision: 6273
Modified:
trunk/scipy/sparse/linalg/eigen/arpack/arpack.py
Log:
ENH: use implicit A'A computation for sparse SVD.
Modified: trunk/scipy/sparse/linalg/eigen/arpack/arpack.py
===================================================================
--- trunk/scipy/sparse/linalg/eigen/arpack/arpack.py 2010-03-26 05:35:25 UTC (rev 6272)
+++ trunk/scipy/sparse/linalg/eigen/arpack/arpack.py 2010-03-26 05:35:35 UTC (rev 6273)
@@ -519,22 +519,35 @@
else:
op = lambda x: x.T
- def _left(x):
+ tp = A.dtype.char
+ linear_at = aslinearoperator(op(A))
+ linear_a = aslinearoperator(A)
+
+ def _left(x, sz):
x = csc_matrix(x)
- m = op(x) * x
- eigvals, eigvec = eigen_symmetric(m, k)
+ matvec = lambda x: linear_at.matvec(linear_a.matvec(x))
+ params = _SymmetricArpackParams(sz, k, tp, matvec)
+
+ while not params.converged:
+ params.iterate()
+ eigvals, eigvec = params.extract(True)
s = np.sqrt(eigvals)
v = eigvec
u = (x * v) / s
return u, s, op(v)
- def _right(x):
+ def _right(x, sz):
x = csr_matrix(x)
- m = x * op(x)
- eigvals, eigvec = eigen_symmetric(m, k)
+ matvec = lambda x: linear_a.matvec(linear_at.matvec(x))
+ params = _SymmetricArpackParams(sz, k, tp, matvec)
+
+ while not params.converged:
+ params.iterate()
+ eigvals, eigvec = params.extract(True)
+
s = np.sqrt(eigvals)
u = eigvec
@@ -542,6 +555,6 @@
return u, s, vh
if n > m:
- return _left(A)
+ return _left(A, m)
else:
- return _right(A)
+ return _right(A, n)
More information about the Scipy-svn
mailing list