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 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}