1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
use num_traits::Signed;
use std::ops::{Index, IndexMut, Neg};
#[derive(Debug)]
pub struct SquareMatrix<C> {
pub size: usize,
data: Vec<C>,
}
impl<C: Clone> SquareMatrix<C> {
pub fn new(size: usize, value: C) -> SquareMatrix<C> {
let mut v = Vec::with_capacity(size * size);
v.resize(size * size, value);
SquareMatrix {
size: size,
data: v,
}
}
pub fn fill(&mut self, value: C) {
self.data.clear();
self.data.resize(self.size * self.size, value);
}
}
impl<C: Clone> Clone for SquareMatrix<C> {
fn clone(&self) -> SquareMatrix<C> {
SquareMatrix {
size: self.size,
data: self.data.clone(),
}
}
}
impl<C: Clone + Signed> Neg for SquareMatrix<C> {
type Output = SquareMatrix<C>;
fn neg(self) -> SquareMatrix<C> {
SquareMatrix {
size: self.size,
data: self.data.iter().map(|x| -x.clone()).collect::<Vec<_>>(),
}
}
}
impl<C> SquareMatrix<C> {
pub fn from_vec(values: Vec<C>) -> SquareMatrix<C> {
let size = (values.len() as f32).sqrt().round() as usize;
assert_eq!(
size * size,
values.len(),
"length of vector is not a square number"
);
SquareMatrix {
size: size,
data: values,
}
}
fn idx(&self, i: &(usize, usize)) -> usize {
i.0 * self.size + i.1
}
}
impl<'a, C> Index<&'a (usize, usize)> for SquareMatrix<C> {
type Output = C;
fn index(&self, index: &'a (usize, usize)) -> &C {
&self.data[self.idx(index)]
}
}
impl<'a, C> IndexMut<&'a (usize, usize)> for SquareMatrix<C> {
fn index_mut(&mut self, index: &'a (usize, usize)) -> &mut C {
let i = self.idx(index);
&mut self.data[i]
}
}