use russell_lab::Matrix;
pub trait AsMatrix3x3 {
fn at(&self, i: usize, j: usize) -> f64;
}
impl AsMatrix3x3 for Vec<Vec<f64>> {
fn at(&self, i: usize, j: usize) -> f64 {
self[i][j]
}
}
impl AsMatrix3x3 for &[&[f64]] {
fn at(&self, i: usize, j: usize) -> f64 {
self[i][j]
}
}
impl AsMatrix3x3 for [[f64; 3]; 3] {
fn at(&self, i: usize, j: usize) -> f64 {
self[i][j]
}
}
impl AsMatrix3x3 for Matrix {
fn at(&self, i: usize, j: usize) -> f64 {
self.get(i, j)
}
}
#[cfg(test)]
mod tests {
use super::AsMatrix3x3;
use russell_lab::Matrix;
fn flatten(mat: &dyn AsMatrix3x3) -> Vec<f64> {
let mut res = vec![0.0; 9];
let mut m = 0;
for i in 0..3 {
for j in 0..3 {
res[m] = mat.at(i, j);
m += 1;
}
}
res
}
#[test]
fn as_matrix_3x3_works() {
let mat = vec![vec![1.0, 2.0, 3.0], vec![4.0, 5.0, 6.0], vec![7.0, 8.0, 9.0]];
assert_eq!(flatten(&mat), &[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]);
let mat: &[&[f64]] = &[&[10.0, 20.0, 30.0], &[40.0, 50.0, 60.0], &[70.0, 80.0, 90.0]];
assert_eq!(flatten(&mat), &[10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 80.0, 90.0]);
let mat = [[100.0, 200.0, 300.0], [400.0, 500.0, 600.0], [700.0, 800.0, 900.0]];
assert_eq!(
flatten(&mat),
&[100.0, 200.0, 300.0, 400.0, 500.0, 600.0, 700.0, 800.0, 900.0]
);
let mat = Matrix::from(&[[-1.0, -2.0, -3.0], [-4.0, -5.0, -6.0], [-7.0, -8.0, -9.0]]);
assert_eq!(flatten(&mat), &[-1.0, -2.0, -3.0, -4.0, -5.0, -6.0, -7.0, -8.0, -9.0]);
}
}