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
use num::traits::Signed;
use error::SRError;
use algebra::structure::CommutativeMonoidAddPartial;
use matrix::view::MatrixView;
use matrix::traits::*;
impl <'a, T:CommutativeMonoidAddPartial+Signed+PartialOrd> MinMaxAbs<T> for MatrixView<'a, T> {
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();
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)
}
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();
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)
}
}