BilakshanP

Determinant of a Matrix of any Size

Dec 16th, 2022
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 5.47 KB | Source Code | 0 0
  1. #![allow(dead_code)]
  2. #![allow(unused)]
  3.  
  4. fn main(){
  5.     let matrix: Vec<Vec<f64>> = vec![
  6.                                     vec![1.1, 2.2, 3.6],
  7.                                     vec![4.1, 1.2, 6.6],
  8.                                     vec![7.1, 8.2, 9.6]
  9.                                 ];
  10.    
  11.     // no. of times det2 is called
  12.     // while finding determinant
  13.     // of matrices of following sizes:
  14.     // 1 -> 0
  15.     // 2 -> 1
  16.     // 3 -> 3
  17.     // 4 -> 12
  18.     // 5 -> 60
  19.     // 6 -> 360
  20.     // 7 -> 2520
  21.     // 8 -> 20160
  22.     // 9 -> 181440
  23.     // 10 -> 1814400
  24.    
  25.     println!("{}", determinant(&matrix));
  26. }
  27.  
  28. fn matrix_print(matrix: &Vec<Vec<f64>>){
  29.     for i in matrix.iter(){
  30.         print!("( ");
  31.  
  32.         for j in i.iter(){
  33.             print!("{} ", j)
  34.         }
  35.  
  36.         println!(")")
  37.     }
  38.  
  39.     println!("")
  40. }
  41.  
  42. fn get_order(matrix: &Vec<Vec<f64>>) -> (usize, usize) {
  43.     (matrix.len(), matrix[0].len())
  44. }
  45.  
  46. fn trim_around(matrix: &Vec<Vec<f64>>, row: usize, col: usize) -> Vec<Vec<f64>> {
  47.     let mut out_mat: Vec<Vec<f64>> = vec![];
  48.  
  49.     for (i1, j1) in matrix.iter().enumerate(){
  50.         if i1 == row {
  51.             continue;
  52.         }
  53.  
  54.         let mut tmp_mat: Vec<f64> = vec![];
  55.             for (i2, j2) in j1.iter().enumerate(){
  56.                 if i2 == col {
  57.                     continue;
  58.                 }
  59.  
  60.                 tmp_mat.push(*j2);
  61.             }
  62.  
  63.             out_mat.push(tmp_mat.clone());
  64.     }
  65.  
  66.     out_mat
  67. }
  68.  
  69. fn reduce(matrix: &Vec<Vec<f64>>) -> Vec<Vec<Vec<f64>>> {
  70.     let mut out_mat: Vec<Vec<Vec<f64>>> = vec![];
  71.  
  72.     for i in 0..matrix.len() {
  73.         for j in 0..matrix[0].len() {
  74.             out_mat.push(trim_around(matrix, i, j))
  75.         }
  76.     }
  77.  
  78.     out_mat
  79. }
  80.  
  81. fn inner_reduce(matrix: &Vec<Vec<f64>>) -> Vec<Vec<Vec<f64>>>{
  82.     let mut out_mat: Vec<Vec<Vec<f64>>> = vec![];
  83.  
  84.     for i in 0..matrix[0].len() {
  85.         out_mat.push(trim_around(matrix, 0, i))
  86.     }
  87.  
  88.     out_mat
  89. }
  90.  
  91. fn inner_reduce_indexed(matrix: &Vec<Vec<f64>>, row: usize) -> Vec<Vec<Vec<f64>>>{
  92.     let mut out_mat: Vec<Vec<Vec<f64>>> = vec![];
  93.  
  94.     for i in 0..matrix[row].len() {
  95.         out_mat.push(trim_around(matrix, row, i))
  96.     }
  97.  
  98.     out_mat
  99. }
  100.  
  101. fn flatten(matrix: &Vec<Vec<f64>>) -> Vec<f64> {
  102.     let mut out_vec: Vec<f64> = vec![];
  103.     let mut times: f64 = 1.0;
  104.  
  105.     for i in matrix.iter(){
  106.         for j in i.iter(){
  107.             out_vec.push(*j * times);
  108.  
  109.             times *= -1.0;
  110.         }
  111.     }
  112.  
  113.     out_vec
  114. }
  115.  
  116. fn inner_flatten(matrix: &Vec<Vec<f64>>, row: usize) -> Vec<f64> {
  117.     let mut out_vec: Vec<f64> = vec![];
  118.     let mut times: f64 = 1.0;
  119.  
  120.     for i in matrix[0].iter(){
  121.         out_vec.push(*i* times);
  122.  
  123.         times *= -1.0;
  124.     }
  125.  
  126.     out_vec
  127. }
  128.  
  129. fn inner_flatten_indexed(matrix: &Vec<Vec<f64>>, row: usize) -> Vec<f64> {
  130.     let mut out_vec: Vec<f64> = vec![];
  131.     let mut times: f64 = 1.0;
  132.  
  133.     for i in matrix[row].iter(){
  134.         out_vec.push(*i* times);
  135.  
  136.         times *= -1.0;
  137.     }
  138.  
  139.     out_vec
  140. }
  141.  
  142. fn det2(matrix: &Vec<Vec<f64>>) -> f64 {
  143.     matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0]
  144. }
  145.  
  146. fn determinant(matrix: &Vec<Vec<f64>>) -> f64 {
  147.     let order: (usize, usize) = get_order(matrix);
  148.  
  149.     if order.0 != order.1 {
  150.         return 0.0;
  151.     }
  152.  
  153.     if order.0 == 1 {
  154.         return matrix[0][0];
  155.     }
  156.  
  157.     if order.0 == 2 {
  158.         return det2(matrix);
  159.     }
  160.  
  161.     let reduced: Vec<Vec<Vec<f64>>> = inner_reduce(matrix);
  162.     let falttened: Vec<f64> = flatten(matrix);
  163.  
  164.     let mut tmp_vec: Vec<f64> = vec![];
  165.  
  166.     for i in 0..order.0 {
  167.         tmp_vec.push(falttened[i] * inner_determinant(&reduced[i])); //spawns mulmtiple little demons
  168.     }
  169.  
  170.     return tmp_vec.iter().sum();
  171. }
  172.  
  173. fn determinant_indexed(matrix: &Vec<Vec<f64>>, row: usize) -> f64 {
  174.     let order: (usize, usize) = get_order(matrix);
  175.  
  176.     if row >= order.0 {
  177.         return 0.0;
  178.     }
  179.  
  180.     if order.0 != order.1 {
  181.         return 0.0;
  182.     }
  183.  
  184.     if order.0 == 1 {
  185.         return matrix[0][0];
  186.     }
  187.  
  188.     if order.0 == 2 {
  189.         return det2(matrix);
  190.     }
  191.  
  192.     let reduced: Vec<Vec<Vec<f64>>> = inner_reduce_indexed(matrix, row);
  193.     let falttened: Vec<f64> = inner_flatten_indexed(matrix, row);
  194.  
  195.     let mut tmp_vec: Vec<f64> = vec![];
  196.  
  197.     for i in 0..order.0 {
  198.         tmp_vec.push(falttened[i] * inner_determinant(&reduced[i])); //spawns mulmtiple little demons
  199.     }
  200.  
  201.     return tmp_vec.iter().sum::<f64>() * (-1.0_f64).powi(row as i32);
  202. }
  203.  
  204. fn inner_determinant(matrix: &Vec<Vec<f64>>) -> f64 {
  205.     let order_r = matrix.len();
  206.  
  207.     if order_r == 2 {
  208.         return det2(matrix);
  209.     }
  210.  
  211.     let reduced: Vec<Vec<Vec<f64>>> = inner_reduce(matrix);
  212.     let falttened: Vec<f64> = flatten(matrix);
  213.  
  214.     let mut tmp_vec: Vec<f64> = vec![];
  215.  
  216.     for i in 0..order_r {
  217.         tmp_vec.push(falttened[i] * inner_determinant(&reduced[i])); //spawns mulmtiple little demons
  218.     }
  219.  
  220.     return tmp_vec.iter().sum();
  221. }
  222.  
  223. fn inner_determinant_indexed(matrix: &Vec<Vec<f64>>, row: usize) -> f64 {
  224.     let order_r = matrix.len();
  225.  
  226.     if order_r == 2 {
  227.         return det2(matrix);
  228.     }
  229.  
  230.     let reduced: Vec<Vec<Vec<f64>>> = inner_reduce_indexed(matrix, row);
  231.     let falttened: Vec<f64> = inner_flatten_indexed(matrix, row);
  232.  
  233.     let mut tmp_vec: Vec<f64> = vec![];
  234.  
  235.     for i in 0..order_r {
  236.         tmp_vec.push(falttened[i] * inner_determinant_indexed(&reduced[i], row)); //spawns mulmtiple little demons
  237.     }
  238.  
  239.     return tmp_vec.iter().sum();
  240. }
Add Comment
Please, Sign In to add comment