1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// std imports

// external imports
use num::traits::Signed;


// local imports
use error::SRError;
use algebra::structure::CommutativeMonoidAddPartial;
use matrix::view::MatrixView;
use matrix::traits::*;

/// Implementation of min-max with absolute values API for matrix view
impl <'a, T:CommutativeMonoidAddPartial+Signed+PartialOrd> MinMaxAbs<T> for MatrixView<'a, T> {

    // Returns the absolute minimum scalar value
    fn min_abs_scalar(&self) -> (T, usize, usize){
        if self.is_empty(){
            panic!(SRError::EmptyMatrix.to_string());
        }
        let mut v = unsafe {self.get_unchecked(0, 0)}.abs();
        // The location
        let mut rr = 0;
        let mut cc = 0;
        let ps = self.matrix().as_ptr();
        for c in 0..self.num_cols(){
            for r in 0..self.num_rows(){
                let src_offset = self.cell_to_offset(r, c);
                let s = unsafe{*ps.offset(src_offset)}.abs();
                if s < v { 
                    v = s;
                    rr = r;
                    cc = c;
                };
            }
        }
        (v, rr, cc)
    }

    // Returns the maximum scalar value
    fn max_abs_scalar(&self) -> (T, usize, usize){
        if self.is_empty(){
            panic!(SRError::EmptyMatrix.to_string());
        }
        let mut v = unsafe {self.get_unchecked(0, 0)}.abs();
        // The location
        let mut rr = 0;
        let mut cc = 0;
        let ps = self.matrix().as_ptr();
        for c in 0..self.num_cols(){
            for r in 0..self.num_rows(){
                let src_offset = self.cell_to_offset(r, c);
                let s = unsafe{*ps.offset(src_offset)}.abs();
                if s > v { 
                    v  = s;
                    rr = r;
                    cc = c;
                }
            }
        }
        (v, rr, cc)
    }    
}