use std::env;
use mini_matrix::{angle_cos, cross_product, lerp, linear_combination, Matrix, Vector};
fn main() {
let args: Vec<String> = env::args().collect();
if args.len() < 2 {
eprintln!("Usage: {} <exercise_number>", args[0]);
std::process::exit(1);
}
let exercise_number: usize = match args[1].parse() {
Ok(num) => num,
Err(_) => {
eprintln!("Error: Exercise number must be a positive integer.");
std::process::exit(1);
}
};
match exercise_number {
1 => ex01(),
2 => ex02(),
3 => ex03(),
4 => ex04(),
5 => ex05(),
6 => ex06(),
7 => ex07(),
8 => ex08(),
9 => ex09(),
10 => ex10(),
11 => ex11(),
12 => ex12(),
13 => ex13(),
14 => ex14(),
_ => {
eprintln!("Error: Exercise number must be between 1 and 14.");
std::process::exit(1);
}
}
}
fn ex01() {
println!("Running Exercise 1: Vector and Matrix Operations...");
let mut u = Vector::from([2., 3.]);
let v = Vector::from([5., 7.]);
u.add(&v);
println!("{}", u);
let mut u = Vector::from([2., 3.]);
let v = Vector::from([5., 7.]);
u.sub(&v);
println!("{}", u);
let mut u = Vector::from([2., 3.]);
u.scl(2.);
println!("{}", u);
let mut u = Matrix::from([[1., 2.], [3., 4.]]);
let v = Matrix::from([[7., 4.], [-2., 2.]]);
u.add(&v);
println!("{}", u);
let mut u = Matrix::from([[1., 2.], [3., 4.]]);
let v = Matrix::from([[7., 4.], [-2., 2.]]);
u.sub(&v);
println!("{}", u);
let mut u = Matrix::from([[1., 2.], [3., 4.]]);
u.scl(2.);
println!("{}", u);
}
fn ex02() {
println!("Running Exercise 2: Linear Combination...");
let e1 = Vector::from([1., 0., 0.]);
let e2 = Vector::from([0., 1., 0.]);
let e3 = Vector::from([0., 0., 1.]);
let v1 = Vector::from([1., 2., 3.]);
let v2 = Vector::from([0., 10., -100.]);
println!(
"{}",
linear_combination(&mut [e1, e2, e3], &[10., -2., 0.5])
);
println!("{}", linear_combination(&mut [v1, v2], &[10., -2.]));
}
fn ex03() {
println!("{}", lerp(0., 1., 0.));
println!("{}", lerp(0., 1., 1.));
println!("{}", lerp(0., 1., 0.5));
println!("{}", lerp(21., 42., 0.3));
println!(
"{}",
lerp(Vector::from([2., 1.]), Vector::from([4., 2.]), 0.3)
);
println!(
"{}",
lerp(
Matrix::from([[2., 1.], [3., 4.]]),
Matrix::from([[20., 10.], [30., 40.]]),
0.5
)
);
}
fn ex04() {
println!("Running Exercise 3: Dot Product...");
let u = Vector::from([0., 0.]);
let v = Vector::from([1., 1.]);
println!("{}", u.dot(&v));
let u = Vector::from([1., 1.]);
let v = Vector::from([1., 1.]);
println!("{}", u.dot(&v));
let u = Vector::from([-1., 6.]);
let v = Vector::from([3., 2.]);
println!("{}", u.dot(&v));
}
fn ex05() {
println!("Running Exercise 4: Norms...");
let u = Vector::from([0., 0., 0.]);
println!("{}, {}, {}", u.norm_1(), u.norm(), u.norm_inf());
let u = Vector::from([1., 2., 3.]);
println!("{}, {}, {}", u.norm_1(), u.norm(), u.norm_inf());
let u = Vector::from([-1., -2.]);
println!("{}, {}, {}", u.norm_1(), u.norm(), u.norm_inf());
}
fn ex06() {
println!("Running Exercise 5: Angle Cos...");
let u = Vector::from([1., 0.]);
let v = Vector::from([1., 0.]);
println!("{}", angle_cos(&u, &v));
let u = Vector::from([1., 0.]);
let v = Vector::from([0., 1.]);
println!("{}", angle_cos(&u, &v));
let u = Vector::from([-1., 1.]);
let v = Vector::from([1., -1.]);
println!("{}", angle_cos(&u, &v));
let u = Vector::from([2., 1.]);
let v = Vector::from([4., 2.]);
println!("{}", angle_cos(&u, &v));
let u = Vector::from([1., 2., 3.]);
let v = Vector::from([4., 5., 6.]);
println!("{}", angle_cos(&u, &v));
}
fn ex07() {
println!("Running Exercise 6: Cross Product...");
let u = Vector::from([0., 0., 1.]);
let v = Vector::from([1., 0., 0.]);
println!("{}", cross_product(&u, &v));
let u = Vector::from([1., 2., 3.]);
let v = Vector::from([4., 5., 6.]);
println!("{}", cross_product(&u, &v));
let u = Vector::from([4., 2., -3.]);
let v = Vector::from([-2., -5., 16.]);
println!("{}", cross_product(&u, &v));
}
fn ex08() {
println!("Running Exercise 7: Matrix Multiplication...");
let mut u = Matrix::from([[1., 0.], [0., 1.]]);
let v = Vector::from([4., 2.]);
println!("{}", u.mul_vec(&v));
let mut u = Matrix::from([[2., 0.], [0., 2.]]);
let v = Vector::from([4., 2.]);
println!("{}", u.mul_vec(&v));
let mut u = Matrix::from([[2., -2.], [-2., 2.]]);
let v = Vector::from([4., 2.]);
println!("{}", u.mul_vec(&v));
let mut u = Matrix::from([[1., 0.], [0., 1.]]);
let v = Matrix::from([[1., 0.], [0., 1.]]);
println!("{}", u.mul_mat(&v));
let mut u = Matrix::from([[1., 0.], [0., 1.]]);
let v = Matrix::from([[2., 1.], [4., 2.]]);
println!("{}", u.mul_mat(&v));
let mut u = Matrix::from([[3., -5.], [6., 8.]]);
let v = Matrix::from([[2., 1.], [4., 2.]]);
println!("{}", u.mul_mat(&v));
}
fn ex09() {
println!("Running Exercise 8: Trace");
let u = Matrix::from([[1., 0.], [0., 1.]]);
println!("{}", u.trace());
let u = Matrix::from([[2., -5., 0.], [4., 3., 7.], [-2., 3., 4.]]);
println!("{}", u.trace());
let u = Matrix::from([[-2., -8., 4.], [1., -23., 4.], [0., 6., 4.]]);
println!("{}", u.trace());
}
fn ex10() {
println!("Running Exercise 9: Transpose");
let mut m = Matrix::from([[1., 2., 3.], [4., 5., 6.], [7., 8., 9.]]);
println!("{}", m.transpose());
let mut u = Matrix::from([[1., 0.], [0., 1.]]);
println!("{}", u.transpose());
let mut u = Matrix::from([[2., -5., 0.], [4., 3., 7.], [-2., 3., 4.]]);
println!("{}", u.transpose());
}
fn ex11() {
println!("Running Exercise 10: Reduced Row Echelon Form...");
let u = Matrix::from([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]]);
println!("{}", u.row_echelon());
let u = Matrix::from([[1., 2.], [3., 4.]]);
println!("{}", u.row_echelon());
let u = Matrix::from([[1., 2.], [2., 4.]]);
println!("{}", u.row_echelon());
let u = Matrix::from([
[8., 5., -2., 4., 28.],
[4., 2.5, 20., 4., -4.],
[8., 5., 1., 4., 17.],
]);
println!("{}", u.row_echelon());
}
fn ex12() {
println!("Running Exercise 11: Determinant...");
let u = Matrix::from([[1., -1.], [-1., 1.]]);
println!("{}", u.determinant());
let u = Matrix::from([[2., 0., 0.], [0., 2., 0.], [0., 0., 2.]]);
println!("{}", u.determinant());
let u = Matrix::from([[8., 5., -2.], [4., 7., 20.], [7., 6., 1.]]);
println!("{}", u.determinant());
let u = Matrix::from([
[8., 5., -2., 4.],
[4., 2.5, 20., 4.],
[8., 5., 1., 4.],
[28., -4., 17., 1.],
]);
println!("{}", u.determinant());
}
fn ex13() {
println!("Running Exercise 12: Inverse...");
let u = Matrix::from([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]]);
println!("{}", u.inverse().unwrap());
let u = Matrix::from([[2., 0., 0.], [0., 2., 0.], [0., 0., 2.]]);
println!("{}", u.inverse().unwrap());
let u = Matrix::from([[8., 5., -2.], [4., 7., 20.], [7., 6., 1.]]);
println!("{}", u.inverse().unwrap());
}
fn ex14() {
println!("Running Exercise 13: Rank");
let u = Matrix::from([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]]);
println!("{}", u.rank());
let u = Matrix::from([[1., 2., 0., 0.], [2., 4., 0., 0.], [-1., 2., 1., 1.]]);
println!("{}", u.rank());
let u = Matrix::from([[8., 5., -2.], [4., 7., 20.], [7., 6., 1.], [21., 18., 7.]]);
println!("{}", u.rank());
}