GitHub - minimalrust/argmm: SIMD implementation of argmin and argmax

NOTICE

The preferred package is now argminmax which is actively maintained and far more feature complete. This repo will be purely experimental from now on. A special thanks to jvdd for building on the idea and taking it to the next step 👏.

Argmin/max with SIMD support for u8, i16, u16, i32 and f32 arrays and vectors.

Installing

Add the following to your Cargo.toml

Getting started

You can use the extention trait which will take advantage of SIMD if available

use argmm::ArgMinMax;

fn main() {
    let v = vec![1., 3., -20., 50., -82., 9., -53., 60., 0.];
    let min_index = v.argmin();
    let max_index = v.argmax();
    assert_eq!(min_index, Some(4));
    assert_eq!(max_index, Some(7));
}

Alternatively, the generic function can be used if you require non-SIMD support for other types

use argmm::generic::{simple_argmin, simple_argmax};

fn main() {
    let v = vec![1u64, 3, 20, 50, 82, 9, 53, 60, 0];
    let min_index = simple_argmin(&v);
    let max_index = simple_argmax(&v);
    assert_eq!(min_index, 8);
    assert_eq!(max_index, 4);
}

Benchmarks

Using a MacBook Pro (Retina, 13-inch, Early 2015) Processor 2.7 GHz Dual-Core Intel Core i5 with an array size of 512.

See /benches/results.

Warning

NAN values are not supported.

License

Licensed under either of