Skip to content

Commit 82e6ba3

Browse files
committed
solvers: maked todo expose eigenvalues for generalized eigen solver
1 parent 6f679c7 commit 82e6ba3

File tree

2 files changed

+21
-15
lines changed

2 files changed

+21
-15
lines changed

include/eigenpy/decompositions/GeneralizedEigenSolver.hpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,16 @@ struct GeneralizedEigenSolverVisitor
3232
"Computes the generalized eigendecomposition of given matrix "
3333
"pair. "))
3434

35+
.def("eigenvectors", &Solver::eigenvectors, bp::arg("self"),
36+
"Returns an expression of the computed generalized eigenvectors. ")
37+
// TODO: Expose so that the return type are convertible to np arrays
38+
.def("eigenvalues", &Solver::eigenvalues, bp::arg("self"),
39+
"Returns an expression of the computed generalized eigenvalues. ")
40+
3541
.def("alphas", &Solver::alphas, bp::arg("self"),
36-
"Returns the vectors containing the alpha values ")
42+
"Returns the vectors containing the alpha values. ")
3743
.def("betas", &Solver::betas, bp::arg("self"),
38-
"Returns the vectors containing the beta values ")
44+
"Returns the vectors containing the beta values. ")
3945

4046
.def("compute",
4147
&GeneralizedEigenSolverVisitor::compute_proxy<MatrixType>,
@@ -50,9 +56,6 @@ struct GeneralizedEigenSolverVisitor
5056
"Computes generalized eigendecomposition of given matrix. .",
5157
bp::return_self<>())
5258

53-
.def("eigenvectors", &Solver::eigenvectors, bp::arg("self"),
54-
"Returns an expression of the computed generalized eigenvectors. ")
55-
5659
.def("info", &Solver::info, bp::arg("self"),
5760
"NumericalIssue if the input contains INF or NaN values or "
5861
"overflow occured. Returns Success otherwise.")

unittest/python/test_generalized_eigen_solver.py

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,24 @@
66
rng = np.random.default_rng()
77
A = rng.random((dim, dim))
88
B = rng.random((dim, dim))
9+
B = (B + B.T) * 0.5 + np.diag(10.0 + rng.random(dim)) # Make B not singular
910

1011
ges = eigenpy.GeneralizedEigenSolver(A, B)
1112

13+
assert ges.info() == eigenpy.ComputationInfo.Success
14+
1215
alphas = ges.alphas()
1316
betas = ges.betas()
14-
V = ges.eigenvectors()
1517

16-
eigenvalues = alphas / betas
17-
if np.all(np.abs(betas) >= 1e-15):
18-
for i in range(dim):
19-
v = V[:, i]
20-
lam = eigenvalues[i]
18+
vec = ges.eigenvectors()
19+
20+
val_est = alphas / betas
21+
for i in range(dim):
22+
v = vec[:, i]
23+
lam = val_est[i]
2124

22-
Av = A @ v
23-
lam_Bv = lam * (B @ v)
25+
Av = A @ v
26+
lam_Bv = lam * (B @ v)
2427

25-
assert eigenpy.is_approx(Av.real, lam_Bv.real)
26-
assert eigenpy.is_approx(Av.imag, lam_Bv.imag)
28+
assert eigenpy.is_approx(Av.real, lam_Bv.real)
29+
assert eigenpy.is_approx(Av.imag, lam_Bv.imag)

0 commit comments

Comments
 (0)