grassmann/functions/
partition.rs

1use crate::{Number, Partition, core::matrix::Matrix};
2
3
4
5pub fn partition<T: Number>(A: &Matrix<T>, r: usize) -> Option<Partition<T>> {
6        
7    if r >= A.columns || r >= A.rows {
8        return None;
9    }
10
11    //A11 r x r
12    //A12 r x (n - r)
13    //A21 (n - r) x r
14    //A22 (n - r) x (n - r)
15
16    let mut A11: Matrix<T> = Matrix::new(r, r);
17    let mut A12: Matrix<T> = Matrix::new(r, A.columns - r);
18    let mut A21: Matrix<T> = Matrix::new(A.rows - r, r);
19    let mut A22: Matrix<T> = Matrix::new(A.rows - r, A.columns - r);
20
21    for i in 0..r {
22        for j in 0..r {
23            A11[[i,j]] = A[[i, j]];
24        }
25    }
26
27    for i in 0..r {
28        for j in 0..(A.columns - r) {
29            A12[[i,j]] = A[[i,j + r]];
30        }
31    }
32
33    for i in 0..(A.rows - r) {
34        for j in 0..r {
35            A21[[i,j]] = A[[i + r, j]];
36        }
37    }
38
39    for i in 0..(A.rows - r) {
40        for j in 0..(A.columns - r) {
41            A22[[i,j]] = A[[i + r, j + r]];
42        }
43    }
44
45    Some(
46        Partition {
47            A11,
48            A12,
49            A21,
50            A22
51        }
52    )
53}
54
55
56
57mod tests {
58
59    use crate::{ core::{matrix::{ Matrix }}, matrix, vector };
60
61
62    #[test]
63    fn partition() {
64
65        let A = matrix![i32,
66            1, 2;
67            3, 4;
68        ];
69
70        let p = A.partition(1).unwrap();
71
72        assert_eq!(p.A11.rows, 1, "p.A11.rows == 1");
73        assert_eq!(p.A12.rows, 1, "p.A12.rows == 1");
74        assert_eq!(p.A21.rows, 1, "p.A21.rows == 1");
75        assert_eq!(p.A22.rows, 1, "p.A22.rows == 1");
76
77        assert_eq!(p.A11.columns, 1, "p.A11.columns == 1");
78        assert_eq!(p.A12.columns, 1, "p.A12.columns == 1");
79        assert_eq!(p.A21.columns, 1, "p.A21.columns == 1");
80        assert_eq!(p.A22.columns, 1, "p.A22.columns == 1");
81        
82        assert_eq!(p.A11[[0, 0]], 1, "p.A11[[0, 0]] == 1");
83        assert_eq!(p.A12[[0, 0]], 2, "p.A12[[0, 0]] == 2");
84        assert_eq!(p.A21[[0, 0]], 3, "p.A21[[0, 0]] == 3");
85        assert_eq!(p.A22[[0, 0]], 4, "p.A22[[0, 0]] == 4");
86
87        let A = matrix![i32,
88            1, 2, 3, 6, 4, 6, 2, 5, 4;
89            3, 4, 4, 4, 4, 5, 5, 5, 5;
90            3, 4, 4, 3, 3, 5, 1, 1, 5;
91            3, 4, 4, 3, 3, 5, 1, 1, 5;
92            3, 4, 4, 3, 3, 5, 1, 1, 5;
93        ];
94
95        let p = A.partition(2).unwrap();
96
97        println!("\n partition is \n A11 {} \n A12 {} \n A21 {} \n A22 {} \n", p.A11, p.A12, p.A21, p.A22);
98
99        assert_eq!(p.A12.rows, 2, "p.A12.rows == 2");
100        assert_eq!(p.A12.columns, 7, "p.A12.columns == 7");
101    }
102}