ndarray_linalg/
diagonal.rs1use ndarray::*;
4
5use super::operator::*;
6use super::types::*;
7
8pub struct Diagonal<S: Data> {
10 diag: ArrayBase<S, Ix1>,
11}
12
13pub trait IntoDiagonal<S: Data> {
14 fn into_diagonal(self) -> Diagonal<S>;
15}
16
17pub trait AsDiagonal<A> {
18 fn as_diagonal(&self) -> Diagonal<ViewRepr<&A>>;
19}
20
21impl<S: Data> IntoDiagonal<S> for ArrayBase<S, Ix1> {
22 fn into_diagonal(self) -> Diagonal<S> {
23 Diagonal { diag: self }
24 }
25}
26
27impl<A, S: Data<Elem = A>> AsDiagonal<A> for ArrayBase<S, Ix1> {
28 fn as_diagonal(&self) -> Diagonal<ViewRepr<&A>> {
29 Diagonal { diag: self.view() }
30 }
31}
32
33impl<A, Sa> LinearOperator for Diagonal<Sa>
34where
35 A: Scalar,
36 Sa: Data<Elem = A>,
37{
38 type Elem = A;
39
40 fn apply_mut<S>(&self, a: &mut ArrayBase<S, Ix1>)
41 where
42 S: DataMut<Elem = A>,
43 {
44 for (val, d) in a.iter_mut().zip(self.diag.iter()) {
45 *val *= *d;
46 }
47 }
48}