nalgebra_glm/gtx/component_wise.rs
1use crate::aliases::TMat;
2use crate::traits::Number;
3
4/// The sum of every component of the given matrix or vector.
5///
6/// # Examples:
7///
8/// ```
9/// # use nalgebra_glm as glm;
10/// let vec = glm::vec2(3.0, 4.0);
11/// assert_eq!(7.0, glm::comp_add(&vec));
12///
13/// let mat = glm::mat2(0.0, 1.0, -3.0, 3.0);
14/// assert_eq!(1.0, glm::comp_add(&mat));
15/// ```
16///
17/// # See also:
18///
19/// * [`comp_max()`]
20/// * [`comp_min()`]
21/// * [`comp_mul()`]
22pub fn comp_add<T: Number, const R: usize, const C: usize>(m: &TMat<T, R, C>) -> T {
23 m.iter().fold(T::zero(), |x, y| x + *y)
24}
25
26/// The maximum of every component of the given matrix or vector.
27///
28/// # Examples:
29///
30/// ```
31/// # use nalgebra_glm as glm;
32/// let vec = glm::vec2(3.0, 4.0);
33/// assert_eq!(4.0, glm::comp_max(&vec));
34///
35/// let mat = glm::mat2(0.0, 1.0, -3.0, 3.0);
36/// assert_eq!(3.0, glm::comp_max(&mat));
37/// ```
38///
39/// # See also:
40///
41/// * [`comp_add()`]
42/// * [`comp_max()`]
43/// * [`comp_min()`]
44/// * [`max()`](crate::max)
45/// * [`max2()`](crate::max2)
46/// * [`max3()`](crate::max3)
47/// * [`max4()`](crate::max4)
48pub fn comp_max<T: Number, const R: usize, const C: usize>(m: &TMat<T, R, C>) -> T {
49 m.iter()
50 .fold(T::min_value(), |x, y| crate::max2_scalar(x, *y))
51}
52
53/// The minimum of every component of the given matrix or vector.
54///
55/// # Examples:
56///
57/// ```
58/// # use nalgebra_glm as glm;
59/// let vec = glm::vec2(3.0, 4.0);
60/// assert_eq!(3.0, glm::comp_min(&vec));
61///
62/// let mat = glm::mat2(0.0, 1.0, -3.0, 3.0);
63/// assert_eq!(-3.0, glm::comp_min(&mat));
64/// ```
65///
66/// # See also:
67///
68/// * [`comp_add()`]
69/// * [`comp_max()`]
70/// * [`comp_mul()`]
71/// * [`min()`](crate::min)
72/// * [`min2()`](crate::min2)
73/// * [`min3()`](crate::min3)
74/// * [`min4()`](crate::min4)
75pub fn comp_min<T: Number, const R: usize, const C: usize>(m: &TMat<T, R, C>) -> T {
76 m.iter()
77 .fold(T::max_value(), |x, y| crate::min2_scalar(x, *y))
78}
79
80/// The product of every component of the given matrix or vector.
81///
82/// # Examples:
83///
84/// ```
85/// # use nalgebra_glm as glm;
86/// let vec = glm::vec2(3.0, 4.0);
87/// assert_eq!(12.0, glm::comp_mul(&vec));
88///
89/// let mat = glm::mat2(1.0, 1.0, -3.0, 3.0);
90/// assert_eq!(-9.0, glm::comp_mul(&mat));
91/// ```
92///
93/// # See also:
94///
95/// * [`comp_add()`]
96/// * [`comp_max()`]
97/// * [`comp_min()`]
98pub fn comp_mul<T: Number, const R: usize, const C: usize>(m: &TMat<T, R, C>) -> T {
99 m.iter().fold(T::one(), |x, y| x * *y)
100}
101
102//pub fn vec< L, floatType, Q > compNormalize (vec< L, T, Q > const &v)
103//pub fn vec< L, T, Q > compScale (vec< L, floatType, Q > const &v)