grassmann/functions/
is_diagonally_dominant.rs

1use crate::{Number, core::matrix::Matrix};
2
3
4
5pub fn is_diagonally_dominant<T: Number>(A: &Matrix<T>) -> bool {
6
7    if A.rows != A.columns {
8       return false;
9    }
10
11    let zero = T::from_f64(0.).unwrap();
12
13    for i in 0..A.rows {
14
15        let mut acc = zero;
16
17        let mut p = zero;
18
19        for j in 0..A.columns {
20        
21            if i == j {
22               p = A[[i, j]];
23            } else {
24               acc += A[[i, j]];
25            }
26        }
27
28        if p.abs() < acc.abs() {
29            return false;
30        }
31    }
32    
33    true
34}
35
36
37
38mod tests {
39
40    use crate::{ core::{matrix::{ Matrix }}, matrix, vector };
41
42    #[test]
43    fn is_diagonally_dominant() {
44
45        let mut A: Matrix<i32> = Matrix::id(10);
46        let mut N: Matrix<i32> = Matrix::id(10);
47
48        assert_eq!(A.is_diagonally_dominant(), true, "is_diagonally_dominant - identity is diagonally dominant");
49        
50        A = A * 10;
51        N = N * -2;
52        
53        let mut C: Matrix<i32> = Matrix::new(10, 10);
54
55        C.init_const(1);
56
57        A = A + N;
58        A = A + C;
59        
60        assert_eq!(A.is_diagonally_dominant(), true, "is_diagonally_dominant - after transformation");
61
62        A[[0, 1]] += 1;
63
64        assert_eq!(A.is_diagonally_dominant(), false, "is_diagonally_dominant - no more");
65    }
66
67}