array_matrix/
lib.rs

1#![feature(generic_const_exprs)]
2#![feature(portable_simd)]
3#![recursion_limit = "256"]
4#[allow(incomplete_features)]
5#[allow(const_evaluatable_unchecked)]
6
7pub mod matrix;
8pub mod vector;
9pub use crate::matrix::*;
10pub use crate::vector::*;
11
12#[cfg(test)]
13mod tests {
14    use crate::{Det, MAdd, Trace, Matrix, MInv, Cross, MMul, Eig, QRHouseholder};
15
16    #[test]
17    fn test_det()
18    {
19        let a = [1.0, 0.0, 0.0];
20        let b = [0.0, 1.0, 0.0];
21        let ab = a.cross(b);
22        println!("{}\n", ab.map(|abi| abi.to_string()).join(", "));
23
24        let a = [
25            [1.0],
26            [2.0],
27            [3.0]
28        ];
29        let b = [
30            [1.0, 2.0, 3.0]
31        ];
32        let ab = a.mul(b);
33        println!("{}\n", ab.map(|abr| abr.map(|abrc: f64| abrc.to_string()).join(", ")).join("\n"));
34
35        let a: [[f32; 3]; 3] = [
36            [0.5, -0.1, 0.3],
37            [0.7, -0.2, 0.1],
38            [3.0, -5.0, 1.0]
39        ];
40        println!("{}", a.det());
41        match a.inv()
42        {
43            Some(i) => println!("{}", i.det()),
44            None => ()
45        };
46    }
47
48    #[test]
49    fn system()
50    {
51        let a: [[f32; 2]; 2] = [
52            [-0.5, -0.1],
53            [10.0, -0.2]
54        ];
55        let b: [[f32; 1]; 2] = [
56            [1.0],
57            [0.0]
58        ];
59        let c: [[f32; 2]; 1] = [
60            [0.0, 1.0]
61        ];
62        let d: f32 = 0.0;
63
64        const N: usize = 1000;
65        const T: f32 = 40.0;
66
67        let mut x: [[f32; 1]; 2] = Matrix::empty();
68        let mut y: [f32; N] = [0.0; N];
69        let mut u: f32 = 0.0;
70
71        let dt = T/N as f32;
72
73        for i in 0..N
74        {
75            let dxdt = a.mul(x).add(b.mul(u));
76
77            y[i] = c.mul(x).trace() + d*u;
78            x = x.add(dxdt.mul(dt));
79
80            u = 1.0;
81        }
82
83        println!("{}", y.map(|yn| yn.to_string()).join(", "))
84    }
85
86    #[test]
87    fn eig()
88    {
89        let a: [[f32; 3]; 3] = [
90            [1.0, -2.5, 2.0],
91            [-2.0, 1.0, -3.0],
92            [1.0, -1.5, 1.0]
93        ];
94        let eig: Vec<String> = a.eig().iter().map(|yn| yn.to_string()).collect();
95        println!("detA = {}", a.det());
96        println!("lambda = [\n{}\n]", eig.join("\n"));
97        println!("mul lambda = {}", a.eig().iter().map(|l| *l).reduce(|a, b| a*b).unwrap());
98    }
99
100    #[test]
101    fn qr()
102    {
103        let a: [[f32; 2]; 3] = [
104            [1.0, -0.8],
105            [-3.0, -0.5],
106            [4.0, 5.0]
107        ];
108        println!("a = [\n{}\n]", a.map(|ar| ar.map(|arc| arc.to_string()).join(", ")).join("\n"));
109        let (q, r) = a.qr_householder();
110        println!("q = [\n{}\n]", q.map(|ar| ar.map(|arc| arc.to_string()).join(", ")).join("\n"));
111        println!("r = [\n{}\n]", r.map(|ar| ar.map(|arc| arc.to_string()).join(", ")).join("\n"));
112        let qr = q.mul(r);
113        println!("qr = [\n{}\n]", qr.map(|ar| ar.map(|arc| arc.to_string()).join(", ")).join("\n"));
114    }
115}