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}