opensrdk_linear_algebra/matrix/ss/
mod.rs

1use serde::{Deserialize, Serialize};
2
3use crate::number::Number;
4use std::collections::HashMap;
5
6pub mod index;
7pub mod mul;
8pub mod mul_lhs;
9pub mod mul_rhs;
10
11#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
12pub struct SparseMatrix<T = f64>
13where
14    T: Number,
15{
16    pub rows: usize,
17    pub cols: usize,
18    pub elems: HashMap<(usize, usize), T>,
19    default: T,
20}
21
22impl<T> SparseMatrix<T>
23where
24    T: Number,
25{
26    pub fn new(rows: usize, cols: usize) -> Self {
27        Self {
28            rows,
29            cols,
30            elems: HashMap::new(),
31            default: T::default(),
32        }
33    }
34
35    pub fn from(rows: usize, cols: usize, elems: HashMap<(usize, usize), T>) -> Self {
36        Self {
37            rows,
38            cols,
39            elems,
40            default: T::default(),
41        }
42    }
43
44    pub fn eject(self) -> HashMap<(usize, usize), T> {
45        self.elems
46    }
47
48    pub fn t(&self) -> Self {
49        Self::from(
50            self.cols,
51            self.rows,
52            self.elems.iter().fold(
53                HashMap::<(usize, usize), T>::new(),
54                |mut m: HashMap<(usize, usize), T>, (&(i, j), &value)| {
55                    m.insert((j, i), value);
56
57                    m
58                },
59            ),
60        )
61    }
62}