Skip to main content

vecmat/matrix/
math.rs

1use crate::{Vector, Matrix, traits::Broadcast};
2use num_traits::Float;
3
4impl<T, const M: usize, const N: usize> Broadcast<Matrix<T, M, N>> for Matrix<T, M, N> {
5    fn broadcast(self) -> Self { self }
6}
7impl<T: Copy, const M: usize, const N: usize> Broadcast<Matrix<T, M, N>> for Vector<T, N> {
8    fn broadcast(self) -> Matrix<T, M, N> { Matrix::from_vector_of_vectors(Vector::fill(self)) }
9}
10impl<T: Copy, const M: usize, const N: usize> Broadcast<Matrix<T, M, N>> for T {
11    fn broadcast(self) -> Matrix<T, M, N> { Matrix::fill(self) }
12}
13
14impl<T: Float, const M: usize, const N: usize> Matrix<T, M, N> {
15    pub fn abs(self) -> Self { self.map(T::abs) }
16    pub fn abs_sub<B: Broadcast<Self>>(self, other: B) -> Self { self.zip(other.broadcast()).map(|(s, o)| T::abs_sub(s, o)) }
17    pub fn signum(self) -> Self { self.map(T::signum) }
18    pub fn cbrt(self) -> Self { self.map(T::cbrt) }
19    pub fn sqrt(self) -> Self { self.map(T::sqrt) }
20    pub fn vmin<B: Broadcast<Self>>(self, other: B) -> Self { self.zip(other.broadcast()).map(|(s, o)| T::min(s, o)) }
21    pub fn vmax<B: Broadcast<Self>>(self, other: B) -> Self { self.zip(other.broadcast()).map(|(s, o)| T::max(s, o)) }
22    pub fn clamp<A: Broadcast<Self>, B: Broadcast<Self>>(self, a: A, b: B) -> Self { self.zip(a.broadcast().zip(b.broadcast())).map(|(s, (a, b))| T::min(T::max(s, a), b)) }
23    pub fn acos(self) -> Self { self.map(T::acos) }
24    pub fn asin(self) -> Self { self.map(T::asin) }
25    pub fn atan(self) -> Self { self.map(T::atan) }
26    pub fn atan2<B: Broadcast<Self>>(self, other: B) -> Self { self.zip(other.broadcast()).map(|(s, o)| T::atan2(s, o)) }
27    pub fn cosh(self) -> Self { self.map(T::cosh) }
28    pub fn hypot<B: Broadcast<Self>>(self, other: B) -> Self { self.zip(other.broadcast()).map(|(s, o)| T::hypot(s, o)) }
29    pub fn sinh(self) -> Self { self.map(T::sinh) }
30    pub fn tan(self) -> Self { self.map(T::tan) }
31    pub fn tanh(self) -> Self { self.map(T::tanh) }
32    pub fn log2(self) -> Self { self.map(T::log2) }
33    pub fn mul_add<A: Broadcast<Self>, B: Broadcast<Self>>(self, a: A, b: B) -> Self { self.zip(a.broadcast().zip(b.broadcast())).map(|(s, (a, b))| T::mul_add(s, a, b)) }
34    pub fn exp(self) -> Self { self.map(T::exp) }
35    pub fn powi<B: Broadcast<Matrix<i32, M, N>>>(self, other: B) -> Self { self.zip(other.broadcast()).map(|(s, o)| T::powi(s, o)) }
36    pub fn ln(self) -> Self { self.map(T::ln) }
37    pub fn powf<B: Broadcast<Self>>(self, other: B) -> Self { self.zip(other.broadcast()).map(|(s, o)| T::powf(s, o)) }
38    pub fn log<B: Broadcast<Self>>(self, other: B) -> Self { self.zip(other.broadcast()).map(|(s, o)| T::log(s, o)) }
39    pub fn sin(self) -> Self { self.map(T::sin) }
40    pub fn cos(self) -> Self { self.map(T::cos) }
41    pub fn asinh(self) -> Self { self.map(T::asinh) }
42    pub fn acosh(self) -> Self { self.map(T::acosh) }
43    pub fn atanh(self) -> Self { self.map(T::atanh) }
44    pub fn floor(self) -> Self { self.map(T::floor) }
45    pub fn ceil(self) -> Self { self.map(T::ceil) }
46    pub fn round(self) -> Self { self.map(T::round) }
47    pub fn trunc(self) -> Self { self.map(T::trunc) }
48    pub fn fract(self) -> Self { self.map(T::fract) }
49    pub fn recip(self) -> Self { self.map(T::recip) }
50    pub fn exp2(self) -> Self { self.map(T::exp2) }
51    pub fn log10(self) -> Self { self.map(T::log10) }
52    pub fn sin_cos(self) -> (Self, Self) { self.map(T::sin_cos).unzip() }
53    pub fn exp_m1(self) -> Self { self.map(T::exp_m1) }
54    pub fn ln_1p(self) -> Self { self.map(T::ln_1p) }
55}