lair 0.8.0

Linear algebra in Rust
Documentation
use num_traits::{Float, Zero};

use crate::Scalar;

#[allow(clippy::cast_possible_wrap)]
pub(crate) unsafe fn iamax<A>(n: usize, x: *const A, incx: isize) -> (usize, A::Real)
where
    A: Scalar,
{
    let mut max_val = A::Real::zero();
    let mut max_idx = 0;
    for i in 0..n {
        let elem = x.offset(incx * i as isize);
        let val = (*elem).re().abs() + (*elem).im().abs();
        if val > max_val {
            max_val = val;
            max_idx = i;
        }
    }
    (max_idx, max_val)
}

#[cfg(test)]
mod tests {
    #[test]
    fn iamax() {
        let (idx, max) = unsafe {
            let x = [1., 3., 2.];
            super::iamax(x.len(), &x as *const f64, 1)
        };
        assert_eq!(idx, 1);
        assert_eq!(max, 3.);
    }
}