Advertisement
Guest User

Untitled

a guest
Jun 26th, 2017
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5 3.71 KB | None | 0 0
  1. package matrixmultiply;
  2.  
  3. import java.util.Random;
  4. import java.util.concurrent.ExecutorService;
  5. import java.util.concurrent.Executors;
  6. import java.util.concurrent.TimeUnit;
  7.  
  8. class MatrixRowCalculator implements Runnable {
  9.     private final Matrix A, B, result;
  10.     private final int index;
  11.  
  12.     public MatrixRowCalculator(Matrix A, Matrix B, Matrix result, int index) {
  13.         this.A = A;
  14.         this.B = B;
  15.         this.result = result;
  16.         this.index = index;
  17.     }
  18.  
  19.     public void run() {
  20.         for(int i = 0; i < Main.N; i++) {
  21.             result.setValue(index, i, Matrix.scalarProduct(A.getRow(index), B.getColumn(i)));
  22.         }
  23.     }
  24. }
  25.  
  26. class Matrix {
  27.     public final int rows;
  28.     public final int columns;
  29.     public final int[][] data;
  30.  
  31.     public Matrix(int rows, int columns) {
  32.         this.rows = rows;
  33.         this.columns = columns;
  34.  
  35.         data = new int[rows][];
  36.         for(int i = 0; i < rows; i++)
  37.             data[i] = new int[this.columns];
  38.     }
  39.  
  40.     public Matrix(int rows, int columns, int[] values) {
  41.         this(rows, columns);
  42.         setValues(values);
  43.     }
  44.    
  45.     public final void setValue(int row, int column, int value) {
  46.         data[row][column] = value;
  47.     }
  48.    
  49.     public final void setValues(int[] values) {
  50.         for(int i = 0; i < rows; i++)
  51.             for(int j = 0; j < columns; j++)
  52.                 data[i][j] = values[i*rows + j];
  53.     }
  54.    
  55.     public static int scalarProduct(int[] a, int[] b) {
  56.         int value = 0;
  57.        
  58.         for(int i = 0; i < a.length; i++)
  59.             value += a[i]*b[i];
  60.        
  61.         return value;
  62.     }
  63.  
  64.     public int[] getColumn(int column) {
  65.         int[] ret = new int[rows];
  66.  
  67.         for(int i = 0; i < rows; i++)
  68.             ret[i] = data[i][column];
  69.  
  70.         return ret;
  71.     }
  72.  
  73.     public int[] getRow(int row) {
  74.         return data[row];
  75.     }
  76.  
  77.     @Override
  78.     public String toString() {
  79.         StringBuilder sb = new StringBuilder();
  80.         for(int i = 0; i < rows; i++) {
  81.             boolean first = true;
  82.             for(int j = 0; j < columns; j++) {
  83.                 if(!first)
  84.                     sb.append(" ");
  85.                 else
  86.                     first = false;
  87.  
  88.                 sb.append(data[i][j]);
  89.             }
  90.             if(i + 1 < rows)
  91.                 sb.append("\n");
  92.         }
  93.         return sb.toString();
  94.     }
  95. }
  96.  
  97. public class Main {
  98.     static int N = 1000;
  99.     static int P = 1;
  100.     static int T = 1;
  101.  
  102.     private static void multiply(Matrix A, Matrix B, Matrix result) {
  103.         ExecutorService s = Executors.newFixedThreadPool(P);
  104.  
  105.         for(int i = 0; i < N; i++) {
  106.             s.submit(new MatrixRowCalculator(A, B, result, i));
  107.         }
  108.  
  109.         s.shutdown();
  110.         try {
  111.             s.awaitTermination(1, TimeUnit.DAYS);
  112.         } catch(InterruptedException e) {
  113.  
  114.         }
  115.     }
  116.  
  117.     public static void main(String[] args) {
  118.         final Random random = new Random();
  119.  
  120.         Matrix mA = new Matrix(N, N);
  121.         for(int i = 0; i < N; i++)
  122.             for(int j = 0; j < N; j++)
  123.                 mA.setValue(i, j, random.nextInt(1000));
  124.  
  125.         Matrix mB = new Matrix(N, N);
  126.         for(int i = 0; i < N; i++)
  127.             for(int j = 0; j < N; j++)
  128.                 mB.setValue(i, j, random.nextInt(1000));
  129.  
  130.         for(int i = 0; i < T; i++) {
  131.             final ExecutorService s = Executors.newFixedThreadPool(P);
  132.             final long startTime = System.currentTimeMillis();
  133.             Matrix result = new Matrix(N, N);
  134.             multiply(mA, mB, result);
  135.             final long endTime = System.currentTimeMillis();
  136.             System.out.println("took " + (endTime - startTime));
  137.         }
  138.     }
  139. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement