grassmann/functions/
is_diagonally_dominant.rs1use 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}