package ch.akuhn.matrix; import ch.akuhn.util.Stopwatch; public class PerformanceTest { private M a; public static void main(String[] args) { new PerformanceTest().run(); } public void run() { a = new OneDimensional(1000); double[] v = new double[1000]; Stopwatch.p(); for (int i = 0; i < 10; i++) { a.put((int)(Math.random() * 1000),(int)(Math.random() * 1000),Math.random()); v[(int)(Math.random() * 1000)] = Math.random(); } Stopwatch.p(); for (int i = 0; i < 100; i++) { v = a.mult(v); } Stopwatch.p(); System.out.println(v); } private double opto() { double prod = 0; for (int i = 0; i < 1000; i++) { for (int j = 0; j < 1000; j++) { prod *= a.get(i,j); } } return prod; } } class OneDimensional extends M { protected int lda; protected double[] a; public OneDimensional(int n) { lda = n; a = new double[n*n]; } @Override public double get(int i, int j) { return a[i + lda * j]; } @Override public void put(int i, int j, double value) { a[i + lda * j] = value; } @Override public double[] mult(double[] y) { double[] x = new double[a.length]; for (int n = 0, i = 0; i < lda; i++) { double y_i = y[i]; for (int j = 0; j < lda; j++, n++) { x[j] += a[n] * y_i; } } return x; } } class TwoDimensional extends M { protected double[][] a; public TwoDimensional(int n) { a = new double[n][n]; } @Override public double get(int i, int j) { return a[i][j]; } @Override public void put(int i, int j, double value) { a[i][j] = value; } @Override public double[] mult(double[] y) { double[] x = new double[a.length]; for (int i = 0; i < a.length; i++) { for (int j = 0; j < a[i].length; j++) { x[i] += a[i][j] * y[j]; } } return x; } } abstract class M { public abstract double get(int i, int j); public abstract void put(int i, int j, double value); public abstract double[] mult(double[] v); }