opensrdk_linear_algebra/matrix/ci/
mod.rs1pub 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 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 pub fn col_elems(&self) -> &[T] {
40 &self.col_elems
41 }
42
43 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}