Advertisement
Guest User

Untitled

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