jasonpogi1669

Strassen Matrix Multiplication Original Implementation using Java

Jun 29th, 2021 (edited)
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 10.11 KB | None | 0 0
  1. /*
  2.  * To change this license header, choose License Headers in Project Properties.
  3.  * To change this template file, choose Tools | Templates
  4.  * and open the template in the editor.
  5.  */
  6. package main;
  7.  
  8. /**
  9.  *
  10.  * @author markjasongalang
  11.  */
  12.  
  13. import java.io.*;
  14. import java.util.*;
  15.  
  16. public class Main {
  17.   // multiply two given matrices (parameters)
  18.   static Vector<Vector<Integer>> Multiply2DParts(Vector<Vector<Integer>> a, Vector<Vector<Integer>> b) {
  19.     Vector<Vector<Integer>> res = new Vector<Vector<Integer>>();
  20.     for (int i = 0; i < (int) a.size(); i++) {
  21.       Vector<Integer> temp = new Vector<Integer>();
  22.       for (int j = 0; j < (int) a.size(); j++) {
  23.         int sum = 0;
  24.         for (int k = 0; k < (int) a.size(); k++) {
  25.           sum += (a.get(i).get(k) * b.get(k).get(j));
  26.         }
  27.         temp.add(sum);
  28.       }
  29.       res.add(temp);
  30.     }
  31.     return res;
  32.   }
  33.  
  34.   // add two given matrices (parameters)
  35.   static Vector<Vector<Integer>> Add2DParts(Vector<Vector<Integer>> a, Vector<Vector<Integer>> b) {
  36.     Vector<Vector<Integer>> res = new Vector<Vector<Integer>>();
  37.     for (int i = 0; i < (int) a.size(); i++) {
  38.       Vector<Integer> temp = new Vector<Integer>();
  39.       for (int j = 0; j < (int) a.size(); j++) {
  40.         temp.add(a.get(i).get(j) + b.get(i).get(j));
  41.       }
  42.       res.add(temp);
  43.     }
  44.     return res;
  45.   }
  46.  
  47.   // subtracts two given matrices (parameters)
  48.   static Vector<Vector<Integer>> Subtract2DParts(Vector<Vector<Integer>> a, Vector<Vector<Integer>> b) {
  49.     Vector<Vector<Integer>> res = new Vector<Vector<Integer>>();
  50.     for (int i = 0; i < (int) a.size(); i++) {
  51.       Vector<Integer> temp = new Vector<Integer>();
  52.       for (int j = 0; j < (int) a.size(); j++) {
  53.         temp.add(a.get(i).get(j) - b.get(i).get(j));
  54.       }
  55.       res.add(temp);
  56.     }
  57.     return res;
  58.   }
  59.  
  60.   // separate the 2D matrix from its specific 3D matrix (parameter)
  61.   static Vector<Vector<Integer>> Get2DParts(int id, Vector<Vector<Vector<Integer>>> v) {
  62.     Vector<Vector<Integer>> res = new Vector<Vector<Integer>>();
  63.     for (int i = 0; i < (int) v.get(id).size(); i++) {
  64.       Vector<Integer> temp = new Vector<Integer>();
  65.       for (int j = 0; j < (int) v.get(id).get(i).size(); j++) {
  66.         temp.add(v.get(id).get(i).get(j));
  67.       }
  68.       res.add(temp);
  69.     }
  70.     return res;
  71.   }
  72.  
  73.   // calculate the 'a' - 'h' submatrices using the formula
  74.   static Vector<Vector<Integer>> GetValuesForP(int id, Vector<Vector<Vector<Integer>>> v1, Vector<Vector<Vector<Integer>>> v2) {
  75.     Vector<Vector<Integer>> res = new Vector<Vector<Integer>>();
  76.     Vector<Vector<Integer>> a = Get2DParts(0, v1);
  77.     Vector<Vector<Integer>> b = Get2DParts(1, v1);
  78.     Vector<Vector<Integer>> c = Get2DParts(2, v1);
  79.     Vector<Vector<Integer>> d = Get2DParts(3, v1);
  80.     Vector<Vector<Integer>> e = Get2DParts(0, v2);
  81.     Vector<Vector<Integer>> f = Get2DParts(1, v2);
  82.     Vector<Vector<Integer>> g = Get2DParts(2, v2);
  83.     Vector<Vector<Integer>> h = Get2DParts(3, v2);
  84.     if (id == 1) {
  85.       res = Multiply2DParts(a, Subtract2DParts(f, h));
  86.     } else if (id == 2) {
  87.       res = Multiply2DParts(Add2DParts(a, b), h);
  88.     } else if (id == 3) {
  89.       res = Multiply2DParts(Add2DParts(c, d), e);
  90.    } else if (id == 4) {
  91.       res = Multiply2DParts(d, Subtract2DParts(g, e));
  92.     } else if (id == 5) {
  93.       res = Multiply2DParts(Add2DParts(a, d), Add2DParts(e, h));
  94.     } else if (id == 6) {
  95.       res = Multiply2DParts(Subtract2DParts(b, d), Add2DParts(g, h));
  96.     } else {
  97.       res = Multiply2DParts(Subtract2DParts(a, c), Add2DParts(e, f));
  98.     }
  99.     return res;
  100.   }
  101.  
  102.   // calculate p1 - p7 submatrices using the formula
  103.   static Vector<Vector<Integer>> GetValuesForAnswer(int id, Vector<Vector<Vector<Integer>>> p) {
  104.     Vector<Vector<Integer>> res = new Vector<Vector<Integer>>();
  105.     Vector<Vector<Integer>> p1 = Get2DParts(0, p);
  106.     Vector<Vector<Integer>> p2 = Get2DParts(1, p);
  107.     Vector<Vector<Integer>> p3 = Get2DParts(2, p);
  108.     Vector<Vector<Integer>> p4 = Get2DParts(3, p);
  109.     Vector<Vector<Integer>> p5 = Get2DParts(4, p);
  110.     Vector<Vector<Integer>> p6 = Get2DParts(5, p);
  111.     Vector<Vector<Integer>> p7 = Get2DParts(6, p);
  112.     if (id == 1) {
  113.      res = Add2DParts(p5, p4);
  114.      res = Subtract2DParts(res, p2);
  115.      res = Add2DParts(res, p6);
  116.     } else if (id == 2) {
  117.       res = Add2DParts(p1, p2);
  118.     } else if (id == 3) {
  119.       res = Add2DParts(p3, p4);
  120.     } else {
  121.       res = Add2DParts(p1, p5);
  122.       res = Subtract2DParts(res, p3);
  123.       res = Subtract2DParts(res, p7);
  124.     }
  125.     return res;
  126.   }
  127.  
  128.   // DivideMatrix() -> divide the main matrix into four (n / 2) submatrices
  129.   static Vector<Vector<Vector<Integer>>> DivideMatrix(int[][] mat, int n) {
  130.     Vector<Vector<Vector<Integer>>> v = new Vector<Vector<Vector<Integer>>>();
  131.     for (int i = 0; i < n; i += (n / 2)) {
  132.       for (int j = 0; j < n; j += (n / 2)) {
  133.         Vector<Vector<Integer>> temp_2D = new Vector<Vector<Integer>>();
  134.         for (int k = i; k < (i + (n / 2)); k++) {
  135.           Vector<Integer> temp_1D = new Vector<Integer>();
  136.           for (int l = j; l < (j + (n / 2)); l++) {
  137.             temp_1D.add(mat[k][l]);
  138.           }
  139.           temp_2D.add(temp_1D);
  140.         }
  141.         v.add(temp_2D);
  142.       }
  143.     }
  144.     return v;
  145.   }
  146.  
  147.   public static void main(String[] args) {
  148.     Scanner in = new Scanner(System.in);
  149.     // choose table size (must be a power of 2 e.g., 2, 4, 8)
  150.     int n = 0;
  151.     while (true) {
  152.       System.out.print("Choose table size [2, 4, 8]: ");
  153.       n = in.nextInt();
  154.       if (n != 2 && n != 4 && n != 8) {
  155.         System.out.println("Please try again.");
  156.         continue;
  157.       }
  158.       System.out.println();
  159.       break;
  160.     }
  161.     // input first table
  162.     System.out.println("Enter " + n * n + " elements: [1st - " + n + " x " + n + " table]");
  163.     int[][] x = new int[n][n];
  164.     for (int i = 0; i < n; i++) {
  165.       for (int j = 0; j < n; j++) {
  166.         x[i][j] = in.nextInt();
  167.       }
  168.     }
  169.     // input second table
  170.     System.out.println("Enter " + n * n + " elements: [2nd - " + n + " x " + n + " table]");
  171.     int[][] y = new int[n][n];
  172.     for (int i = 0; i < n; i++) {
  173.       for (int j = 0; j < n; j++) {
  174.         y[i][j] = in.nextInt();
  175.       }
  176.     }
  177.     // divide the ('n' x 'n') matrix into 4 ('n' / 2) submatrices ('x' 2D array)
  178.     Vector<Vector<Vector<Integer>>> v1 = DivideMatrix(x, n);
  179.     // divide the ('n' x 'n') matrix into 4 ('n' / 2) submatrices ('y' 2D array)
  180.     Vector<Vector<Vector<Integer>>> v2 = DivideMatrix(y, n);
  181.     // FOR SIMULATION:
  182.     // 'a' to 'h' submatrices values;
  183.     System.out.println("\nSIMULATION");
  184.     System.out.println("[a - h values]");
  185.     char letter = (char) (97);
  186.     for (int i = 0; i < (int) v1.size(); i++) {
  187.       System.out.println("Submatrix " + letter);
  188.       for (int j = 0; j < (int) v1.get(i).size(); j++) {
  189.         for (int k = 0; k < (int) v1.get(i).get(j).size(); k++) {
  190.           System.out.print(v1.get(i).get(j).get(k) + " ");
  191.         }
  192.         System.out.println("");
  193.       }
  194.       System.out.println("");
  195.       letter = (char) (letter + 1);
  196.     }
  197.     for (int i = 0; i < (int) v2.size(); i++) {
  198.       System.out.println("Submatrix " + letter);
  199.       for (int j = 0; j < (int) v2.get(i).size(); j++) {
  200.         for (int k = 0; k < (int) v2.get(i).get(j).size(); k++) {
  201.           System.out.print(v2.get(i).get(j).get(k) + " ");
  202.         }
  203.         System.out.println("");
  204.       }
  205.       System.out.println("");
  206.       letter = (char) (letter + 1);
  207.     }
  208.     // 'p1' to 'p7' submatrices values
  209.     System.out.println("[p1 - p7 values]");
  210.     Vector<Vector<Vector<Integer>>> p = new Vector<Vector<Vector<Integer>>>();
  211.     for (int i = 0; i < 7; i++) {
  212.       p.add(GetValuesForP(i + 1, v1, v2));
  213.     }
  214.     // 'p' values
  215.     for (int i = 0; i < 7; i++) {
  216.       System.out.println("Submatrix p" + (i + 1) + ": ");
  217.       for (int j = 0; j < (int) p.get(i).size(); j++) {
  218.         for (int k = 0; k < (int) p.get(i).get(j).size(); k++) {
  219.           System.out.print(p.get(i).get(j).get(k) + " ");
  220.         }
  221.         System.out.println("\n");
  222.       }
  223.     }
  224.     // final part
  225.     System.out.println("Final Answer: ");
  226.     Vector<Vector<Vector<Integer>>> res = new Vector<Vector<Vector<Integer>>>();
  227.     for (int i = 0; i < 4; i++) {
  228.       res.add(GetValuesForAnswer(i + 1, p));
  229.     }
  230.     // find the resulting 4 submatrices and store it in a 3D vector
  231.     Vector<Vector<Vector<Integer>>> combine = new Vector<Vector<Vector<Integer>>>();
  232.     for (int i = 0; i < (int) res.size(); i++) {
  233.       Vector<Vector<Integer>> temp_2D = new Vector<Vector<Integer>>();
  234.       for (int j = 0; j < (int) res.get(i).size(); j++) {
  235.         Vector<Integer> temp_1D = new Vector<Integer>();
  236.         for (int k = 0; k < (int) res.get(i).get(j).size(); k++) {
  237.           temp_1D.add(res.get(i).get(j).get(k));
  238.         }
  239.         temp_2D.add(temp_1D);
  240.       }
  241.       combine.add(temp_2D);
  242.     }
  243.     // store them back to their correct positions int the 'n' x 'n' table
  244.     Vector<Vector<Vector<Integer>>> ans = new Vector<Vector<Vector<Integer>>>();
  245.     for (int i = 0; i < (int) combine.size(); i += 2) {
  246.       Vector<Vector<Integer>> temp_2D = new Vector<Vector<Integer>>();
  247.       for (int j = 0; j < (int) combine.get(i).size(); j++) {
  248.         Vector<Integer> temp_1D = new Vector<Integer>();
  249.         for (int k = 0; k < (int) combine.get(i).get(j).size(); k++) {
  250.           int value = combine.get(i).get(j).get(k);
  251.           temp_1D.add(value);
  252.         }
  253.         for (int k = 0; k < (int) combine.get(i).get(j).size(); k++) {
  254.           int value = combine.get(i + 1).get(j).get(k);
  255.           temp_1D.add(value);
  256.         }
  257.         temp_2D.add(temp_1D);
  258.       }
  259.       ans.add(temp_2D);
  260.     }
  261.     // print the 'n' x 'n' table (final answer)
  262.     for (int i = 0; i < (int) ans.size(); i++) {
  263.       for (int j = 0; j < (int) ans.get(i).size(); j++) {
  264.         for (int k = 0; k < (int) ans.get(i).get(j).size(); k++) {
  265.           System.out.print(ans.get(i).get(j).get(k) + " ");
  266.         }
  267.         System.out.println("");
  268.       }
  269.       if (i == (int) ans.size() - 1) {
  270.         System.out.println("");
  271.       }
  272.     }
  273.   }
  274. }
Advertisement
Add Comment
Please, Sign In to add comment