opensrdk_linear_algebra/matrix/ci/
mod.rs

1pub mod evd;
2
3use serde::{Deserialize, Serialize};
4
5use crate::number::Number;
6
7#[derive(Clone, Debug, Default, PartialEq, Hash, Serialize, Deserialize)]
8pub struct CirculantMatrix<T = f64>
9where
10    T: Number,
11{
12    col_elems: Vec<T>,
13}
14
15impl<T> CirculantMatrix<T>
16where
17    T: Number,
18{
19    /// - `col_elems`: First column elements.
20    pub fn new(col_elems: Vec<T>) -> Self {
21        Self { col_elems }
22    }
23
24    pub fn from(row_elems: &[T]) -> Self {
25        let col_elems = if row_elems.len() <= 1 {
26            row_elems.to_vec()
27        } else {
28            row_elems[0..1]
29                .iter()
30                .chain(row_elems[1..].iter().rev())
31                .map(|&e| e)
32                .collect::<Vec<_>>()
33        };
34
35        Self::new(col_elems)
36    }
37
38    /// First column elements.
39    pub fn col_elems(&self) -> &[T] {
40        &self.col_elems
41    }
42
43    /// First row elements.
44    pub fn row_elems(&self) -> Vec<T> {
45        if self.col_elems.len() <= 1 {
46            return self.col_elems.clone();
47        }
48
49        self.col_elems[0..1]
50            .iter()
51            .chain(self.col_elems[1..].iter().rev())
52            .map(|&e| e)
53            .collect::<Vec<_>>()
54    }
55}