opensrdk_linear_algebra/matrix/di/
mod.rs1use 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 pub fn new(d: Vec<T>) -> Self {
23 Self { d }
24 }
25
26 pub fn identity(n: usize) -> Self {
28 Self::new(vec![T::one(); n])
29 }
30
31 pub fn dim(&self) -> usize {
33 self.d.len()
34 }
35
36 pub fn d(&self) -> &[T] {
38 &self.d
39 }
40
41 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 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}