Skip to content

Commit f2909f0

Browse files
committed
Add eigenvalue decomposition example
1 parent 13cf2b3 commit f2909f0

File tree

4 files changed

+53
-8
lines changed

4 files changed

+53
-8
lines changed

examples/truncated_eig.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
extern crate ndarray;
2+
extern crate ndarray_linalg;
3+
4+
use ndarray::*;
5+
use ndarray_linalg::*;
6+
7+
fn main() {
8+
let n = 10;
9+
let v = random_unitary(n);
10+
// set eigenvalues in decreasing order
11+
let t = Array1::linspace(n as f64, -(n as f64), n);
12+
13+
println!("Generate spectrum: {:?}", &t);
14+
15+
let t = Array2::from_diag(&t);
16+
let a = v.dot(&t.dot(&v.t()));
17+
18+
// calculate the truncated eigenproblem decomposition
19+
for (val, _) in TruncatedEig::new(a, TruncatedOrder::Largest) {
20+
println!("Found eigenvalue {}", val[0]);
21+
}
22+
}

examples/truncated_svd.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
extern crate ndarray;
2+
extern crate ndarray_linalg;
3+
4+
use ndarray::*;
5+
use ndarray_linalg::*;
6+
7+
fn main() {
8+
let a = arr2(&[[3., 2., 2.], [2., 3., -2.]]);
9+
10+
// calculate the truncated singular value decomposition for 2 singular values
11+
let result = TruncatedSvd::new(a, TruncatedOrder::Largest).decompose(2).unwrap();
12+
13+
// acquire singular values, left-singular vectors and right-singular vectors
14+
let (u, sigma, v_t) = result.values_vectors();
15+
println!("Result of the singular value decomposition A = UΣV^T:");
16+
println!(" === U ===");
17+
println!("{:?}", u);
18+
println!(" === Σ ===");
19+
println!("{:?}", Array2::from_diag(&sigma));
20+
println!(" === V^T ===");
21+
println!("{:?}", v_t);
22+
}

src/lobpcg/eig.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ impl<A: Float + Scalar + Lapack + PartialOrd + Default> IntoIterator for Truncat
8383
fn into_iter(self) -> TruncatedEigIterator<A> {
8484
TruncatedEigIterator {
8585
step_size: 1,
86+
remaining: self.problem.len_of(Axis(0)),
8687
eig: self,
8788
}
8889
}
@@ -94,14 +95,20 @@ impl<A: Float + Scalar + Lapack + PartialOrd + Default> IntoIterator for Truncat
9495
/// eigenvalue/vector pair. Useful for generating pairs until a certain condition is met.
9596
pub struct TruncatedEigIterator<A: Scalar> {
9697
step_size: usize,
98+
remaining: usize,
9799
eig: TruncatedEig<A>,
98100
}
99101

100102
impl<A: Float + Scalar + Lapack + PartialOrd + Default> Iterator for TruncatedEigIterator<A> {
101103
type Item = (Array1<A>, Array2<A>);
102104

103105
fn next(&mut self) -> Option<Self::Item> {
104-
let res = self.eig.decompose(self.step_size);
106+
if self.remaining == 0 {
107+
return None;
108+
}
109+
110+
let step_size = usize::min(self.step_size, self.remaining);
111+
let res = self.eig.decompose(step_size);
105112

106113
match res {
107114
EigResult::Ok(vals, vecs, norms) | EigResult::Err(vals, vecs, norms, _) => {
@@ -127,6 +134,7 @@ impl<A: Float + Scalar + Lapack + PartialOrd + Default> Iterator for TruncatedEi
127134
};
128135

129136
self.eig.constraints = Some(new_constraints);
137+
self.remaining -= step_size;
130138

131139
Some((vals, vecs))
132140
}

src/lobpcg/lobpcg.rs

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -87,27 +87,20 @@ fn apply_constraints<A: Scalar + Lapack>(
8787
y: ArrayView2<A>,
8888
) {
8989
let gram_yv = y.t().dot(&v);
90-
dbg!(&gram_yv.shape());
9190

9291
let u = gram_yv
9392
.gencolumns()
9493
.into_iter()
9594
.map(|x| {
96-
dbg!(&x.shape());
9795
let res = fact_yy.solvec(&x).unwrap();
9896

99-
dbg!(&res);
100-
10197
res.to_vec()
10298
})
10399
.flatten()
104100
.collect::<Vec<A>>();
105101

106102
let rows = gram_yv.len_of(Axis(0));
107103
let u = Array2::from_shape_vec((rows, u.len() / rows), u).unwrap();
108-
dbg!(&u);
109-
dbg!(y.shape());
110-
dbg!(&v.shape());
111104

112105
v -= &(y.dot(&u));
113106
}

0 commit comments

Comments
 (0)