Advertisement
daskalot

Untitled

Apr 12th, 2019
283
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.11 KB | None | 0 0
  1. import java.util.Scanner;
  2.  
  3.  
  4. class Matrix {
  5.  
  6. private int[][] m;
  7. public int n; //only square matrices
  8. public Matrix(int n){
  9. this.n = n;
  10. m = new int[n][n];
  11. }
  12.  
  13. //set value at i,j
  14. public void setV(int i, int j, int val){
  15. m[i][j] = val;
  16. }
  17.  
  18. // get value at index i,j
  19. public int v(int i, int j){
  20. return m[i][j];
  21. }
  22.  
  23.  
  24. // return a square submatrix from this
  25. public Matrix getSubmatrix(int startRow, int startCol, int dim){
  26. Matrix subM = new Matrix(dim);
  27. for (int i = 0; i<dim ; i++ )
  28. for (int j=0;j<dim ; j++ )
  29. subM.setV(i,j, m[startRow+i][startCol+j]);
  30. return subM;
  31. }
  32.  
  33.  
  34. // write this matrix as a submatrix into b (useful for the result of multiplication)
  35. public void putSubmatrix(int startRow, int startCol, Matrix b){
  36. for (int i = 0; i<b.n ; i++ )
  37. for (int j=0;j<b.n ; j++ )
  38. setV(startRow+i,startCol+j, b.v(i,j));
  39. }
  40.  
  41. // matrix addition
  42. public Matrix sum(Matrix b){
  43. Matrix c = new Matrix(n);
  44. for(int i = 0; i< n;i++){
  45. for(int j = 0; j<n;j++){
  46. c.setV(i, j, m[i][j]+b.v(i, j));
  47. }
  48. }
  49. return c;
  50. }
  51.  
  52. // matrix subtraction
  53. public Matrix sub(Matrix b){
  54. Matrix c = new Matrix(n);
  55. for(int i = 0; i< n;i++){
  56. for(int j = 0; j<n;j++){
  57. c.setV(i, j, m[i][j]-b.v(i, j));
  58. }
  59. }
  60. return c;
  61. }
  62. public void printMatrix(){
  63. for(int i=0;i<this.n;i++,System.out.println())
  64. for(int j=0;j<this.n;System.out.printf("%d ",this.v(i,j)),j++);
  65. }
  66. public int elementSum(){
  67. int rez = 0;
  68. for(int i=0;i<n;i++)
  69. for(int j=0;j<n;j++)
  70. rez += this.m[i][j];
  71. return rez;
  72. }
  73. //simple multiplication
  74. public Matrix mult(Matrix b){
  75. Matrix c = new Matrix(b.n);
  76. //this.printMatrix();
  77. //b.printMatrix();
  78. for(int i=0;i<b.n;i++)
  79. for(int j=0;j<b.n;j++)
  80. for(int k=0;k<b.n;k++)
  81. c.m[i][j] += this.m[i][k]*b.m[k][j];
  82.  
  83.  
  84. return c;
  85. }
  86. public static void cout(int tmp){
  87. System.out.println(tmp);
  88. }
  89.  
  90. // Strassen multiplication
  91. public Matrix multStrassen(Matrix b, int cutoff){
  92. Matrix c = new Matrix(this.n);
  93. if(n == cutoff) return mult(b);
  94. Matrix a11 = this.getSubmatrix(0,0,n/2);
  95. Matrix a12 = this.getSubmatrix(0,n/2,n/2);
  96. Matrix a21 = this.getSubmatrix(n/2,0,n/2);
  97. Matrix a22 = this.getSubmatrix(n/2,n/2,n/2);
  98. Matrix b11 = b.getSubmatrix(0,0,n/2);
  99. Matrix b12 = b.getSubmatrix(0,n/2,n/2);
  100. Matrix b21 = b.getSubmatrix(n/2,0,n/2);
  101. Matrix b22 = b.getSubmatrix(n/2,n/2,n/2);
  102.  
  103. //m1 = (a11+a22)(b11+b22)
  104. Matrix m1 = (a11.sum(a22)).multStrassen(b11.sum(b22),cutoff);
  105. //m2 = (a21+a22)b11
  106. Matrix m2 = (a21.sum(a22)).multStrassen(b11,cutoff);
  107.  
  108. //m3 = a11(b12-b22)
  109. Matrix m3 = a11.multStrassen(b12.sub(b22),cutoff);
  110.  
  111. //m4 = a22(b21-b11)
  112. Matrix m4 = a22.multStrassen(b21.sub(b11),cutoff);
  113.  
  114. //m5 =(a11+a12)b22
  115. Matrix m5 = (a11.sum(a12)).multStrassen(b22,cutoff);
  116.  
  117. //m6 = (a21-a11)(b11+b12)
  118. Matrix m6 = (a21.sub(a11)).multStrassen(b11.sum(b12),cutoff);
  119.  
  120. //m7 = (a12-a22)(b21+b22)
  121. Matrix m7 = (a12.sub(a22)).multStrassen(b21.sum(b22),cutoff);
  122. System.out.println("m1: "+ m1.elementSum());
  123. System.out.println("m2: "+ m2.elementSum());
  124. System.out.println("m3: "+ m3.elementSum());
  125. System.out.println("m4: "+ m4.elementSum());
  126. System.out.println("m5: "+ m5.elementSum());
  127. System.out.println("m6: "+ m6.elementSum());
  128. System.out.println("m7: "+ m7.elementSum());
  129. c.putSubmatrix(0,0,(m1.sum(m4.sub(m5))).sum(m7));
  130. c.putSubmatrix(0,n/2,m3.sum(m5));
  131. c.putSubmatrix(n/2,0,m2.sum(m4));
  132. c.putSubmatrix(n/2,n/2,((m1.sub(m2).sum(m3)).sum(m6)));
  133. return c;
  134. }
  135.  
  136.  
  137. }
  138.  
  139.  
  140.  
  141.  
  142. public class Izziv6{
  143. public static void main(String[] args) {
  144. Scanner sc = new Scanner(System.in);
  145. int N = sc.nextInt();
  146. int cutoff = sc.nextInt();
  147. Matrix A = new Matrix(N);
  148. Matrix B = new Matrix(N);
  149. for(int i=0;i<N;i++)
  150. for(int j=0;j<N;j++)
  151. A.setV(i,j,sc.nextInt());
  152.  
  153. for(int i=0;i<N;i++)
  154. for(int j=0;j<N;j++)
  155. B.setV(i,j,sc.nextInt());
  156. //A.printMatrix();
  157. //B.printMatrix();
  158. Matrix c = A.multStrassen(B,cutoff);
  159. c.printMatrix();
  160. sc.close();
  161. }
  162. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement