Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.Scanner;
- class Matrix {
- private int[][] m;
- public int n; //only square matrices
- public Matrix(int n){
- this.n = n;
- m = new int[n][n];
- }
- //set value at i,j
- public void setV(int i, int j, int val){
- m[i][j] = val;
- }
- // get value at index i,j
- public int v(int i, int j){
- return m[i][j];
- }
- // return a square submatrix from this
- public Matrix getSubmatrix(int startRow, int startCol, int dim){
- Matrix subM = new Matrix(dim);
- for (int i = 0; i<dim ; i++ )
- for (int j=0;j<dim ; j++ )
- subM.setV(i,j, m[startRow+i][startCol+j]);
- return subM;
- }
- // write this matrix as a submatrix into b (useful for the result of multiplication)
- public void putSubmatrix(int startRow, int startCol, Matrix b){
- for (int i = 0; i<b.n ; i++ )
- for (int j=0;j<b.n ; j++ )
- setV(startRow+i,startCol+j, b.v(i,j));
- }
- // matrix addition
- public Matrix sum(Matrix b){
- Matrix c = new Matrix(n);
- for(int i = 0; i< n;i++){
- for(int j = 0; j<n;j++){
- c.setV(i, j, m[i][j]+b.v(i, j));
- }
- }
- return c;
- }
- // matrix subtraction
- public Matrix sub(Matrix b){
- Matrix c = new Matrix(n);
- for(int i = 0; i< n;i++){
- for(int j = 0; j<n;j++){
- c.setV(i, j, m[i][j]-b.v(i, j));
- }
- }
- return c;
- }
- public void printMatrix(){
- for(int i=0;i<this.n;i++,System.out.println())
- for(int j=0;j<this.n;System.out.printf("%d ",this.v(i,j)),j++);
- }
- public int elementSum(){
- int rez = 0;
- for(int i=0;i<n;i++)
- for(int j=0;j<n;j++)
- rez += this.m[i][j];
- return rez;
- }
- //simple multiplication
- public Matrix mult(Matrix b){
- Matrix c = new Matrix(b.n);
- //this.printMatrix();
- //b.printMatrix();
- for(int i=0;i<b.n;i++)
- for(int j=0;j<b.n;j++)
- for(int k=0;k<b.n;k++)
- c.m[i][j] += this.m[i][k]*b.m[k][j];
- return c;
- }
- public static void cout(int tmp){
- System.out.println(tmp);
- }
- // Strassen multiplication
- public Matrix multStrassen(Matrix b, int cutoff){
- Matrix c = new Matrix(this.n);
- if(n == cutoff) return mult(b);
- Matrix a11 = this.getSubmatrix(0,0,n/2);
- Matrix a12 = this.getSubmatrix(0,n/2,n/2);
- Matrix a21 = this.getSubmatrix(n/2,0,n/2);
- Matrix a22 = this.getSubmatrix(n/2,n/2,n/2);
- Matrix b11 = b.getSubmatrix(0,0,n/2);
- Matrix b12 = b.getSubmatrix(0,n/2,n/2);
- Matrix b21 = b.getSubmatrix(n/2,0,n/2);
- Matrix b22 = b.getSubmatrix(n/2,n/2,n/2);
- //m1 = (a11+a22)(b11+b22)
- Matrix m1 = (a11.sum(a22)).multStrassen(b11.sum(b22),cutoff);
- //m2 = (a21+a22)b11
- Matrix m2 = (a21.sum(a22)).multStrassen(b11,cutoff);
- //m3 = a11(b12-b22)
- Matrix m3 = a11.multStrassen(b12.sub(b22),cutoff);
- //m4 = a22(b21-b11)
- Matrix m4 = a22.multStrassen(b21.sub(b11),cutoff);
- //m5 =(a11+a12)b22
- Matrix m5 = (a11.sum(a12)).multStrassen(b22,cutoff);
- //m6 = (a21-a11)(b11+b12)
- Matrix m6 = (a21.sub(a11)).multStrassen(b11.sum(b12),cutoff);
- //m7 = (a12-a22)(b21+b22)
- Matrix m7 = (a12.sub(a22)).multStrassen(b21.sum(b22),cutoff);
- System.out.println("m1: "+ m1.elementSum());
- System.out.println("m2: "+ m2.elementSum());
- System.out.println("m3: "+ m3.elementSum());
- System.out.println("m4: "+ m4.elementSum());
- System.out.println("m5: "+ m5.elementSum());
- System.out.println("m6: "+ m6.elementSum());
- System.out.println("m7: "+ m7.elementSum());
- c.putSubmatrix(0,0,(m1.sum(m4.sub(m5))).sum(m7));
- c.putSubmatrix(0,n/2,m3.sum(m5));
- c.putSubmatrix(n/2,0,m2.sum(m4));
- c.putSubmatrix(n/2,n/2,((m1.sub(m2).sum(m3)).sum(m6)));
- return c;
- }
- }
- public class Izziv6{
- public static void main(String[] args) {
- Scanner sc = new Scanner(System.in);
- int N = sc.nextInt();
- int cutoff = sc.nextInt();
- Matrix A = new Matrix(N);
- Matrix B = new Matrix(N);
- for(int i=0;i<N;i++)
- for(int j=0;j<N;j++)
- A.setV(i,j,sc.nextInt());
- for(int i=0;i<N;i++)
- for(int j=0;j<N;j++)
- B.setV(i,j,sc.nextInt());
- //A.printMatrix();
- //B.printMatrix();
- Matrix c = A.multStrassen(B,cutoff);
- c.printMatrix();
- sc.close();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement