opensrdk_linear_algebra/matrix/di/
mod.rs

1use crate::{ge::Matrix, Number};
2use rayon::prelude::*;
3use serde::{Deserialize, Serialize};
4
5pub mod operators;
6pub mod powf;
7pub mod powi;
8
9#[derive(Clone, Debug, Default, PartialEq, Hash, Serialize, Deserialize)]
10pub struct DiagonalMatrix<T = f64>
11where
12    T: Number,
13{
14    d: Vec<T>,
15}
16
17impl<T> DiagonalMatrix<T>
18where
19    T: Number,
20{
21    /// - `d`: Diagonal elements. The length must be `dimension`.
22    pub fn new(d: Vec<T>) -> Self {
23        Self { d }
24    }
25
26    /// Creates an identity matrix.
27    pub fn identity(n: usize) -> Self {
28        Self::new(vec![T::one(); n])
29    }
30
31    /// Dimension.
32    pub fn dim(&self) -> usize {
33        self.d.len()
34    }
35
36    /// Diagonal elements.
37    pub fn d(&self) -> &[T] {
38        &self.d
39    }
40
41    /// Returns `self.d`
42    pub fn eject(self) -> Vec<T> {
43        self.d
44    }
45
46    pub fn mat(&self) -> Matrix<T> {
47        let n = self.d.len();
48        let mut mat = Matrix::<T>::new(n, n);
49
50        // for i in 0..n {
51        //     mat[i][i] = self.d[i];
52        // }
53
54        mat.elems_mut()
55            .par_iter_mut()
56            .enumerate()
57            .map(|(k, elem)| ((k / n, k % n), elem))
58            .for_each(|((i, j), elem)| {
59                if i == j {
60                    *elem = self.d[i];
61                }
62            });
63
64        mat
65    }
66}
67
68pub trait VectorDiag<T>
69where
70    T: Number,
71{
72    fn diag(self) -> DiagonalMatrix<T>;
73}
74
75impl<T> VectorDiag<T> for Vec<T>
76where
77    T: Number,
78{
79    fn diag(self) -> DiagonalMatrix<T> {
80        DiagonalMatrix::<T>::new(self)
81    }
82}