X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fmath%2FMatrix.java;h=647fc3ad082db043ca3b4d24112a1dfc0c3c8bd1;hb=05d2ce87440717d47ba3dc6ef293e25e4543fdd1;hp=b9c514a5e5eabf26b082dc423773b5d93640aeac;hpb=c19d2a91ca05e052e3408bf5852d88eb5d0608f1;p=jalview.git diff --git a/src/jalview/math/Matrix.java b/src/jalview/math/Matrix.java index b9c514a..647fc3a 100755 --- a/src/jalview/math/Matrix.java +++ b/src/jalview/math/Matrix.java @@ -1,6 +1,6 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.9.0b2) - * Copyright (C) 2015 The Jalview Authors + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ The Jalview Authors * * This file is part of Jalview. * @@ -26,22 +26,23 @@ import jalview.util.MessageManager; import java.io.PrintStream; /** - * DOCUMENT ME! - * - * @author $author$ - * @version $Revision$ + * A class to model rectangular matrices of double values and operations on them */ public class Matrix { - /** - * SMJSPUBLIC + /* + * the cell values in row-major order */ public double[][] value; - /** DOCUMENT ME!! */ + /* + * the number of rows + */ public int rows; - /** DOCUMENT ME!! */ + /* + * the number of columns + */ public int cols; /** DOCUMENT ME!! */ @@ -57,24 +58,31 @@ public class Matrix int maxIter = 45; // fudge - add 15 iterations, just in case /** - * Creates a new Matrix object. + * Creates a new Matrix object. For example * - * @param value - * DOCUMENT ME! - * @param rows - * DOCUMENT ME! - * @param cols - * DOCUMENT ME! + *
+   *   new Matrix(new double[][] {{2, 3, 4}, {5, 6, 7})
+   * constructs
+   *   (2 3 4)
+   *   (5 6 7)
+   * 
+ * + * Note that ragged arrays (with not all rows, or columns, of the same + * length), are not supported by this class. They can be constructed, but + * results of operations on them are undefined and may throw exceptions. + * + * @param values + * the matrix values in row-major order */ - public Matrix(double[][] value, int rows, int cols) + public Matrix(double[][] values) { - this.rows = rows; - this.cols = cols; - this.value = value; + this.rows = values.length; + this.cols = this.rows == 0 ? 0 : values[0].length; + this.value = values; } /** - * DOCUMENT ME! + * Returns a new matrix which is the transposes of this one * * @return DOCUMENT ME! */ @@ -90,7 +98,7 @@ public class Matrix } } - return new Matrix(out, cols, rows); + return new Matrix(out); } /** @@ -113,15 +121,24 @@ public class Matrix } /** - * DOCUMENT ME! + * Returns a new matrix which is the result of premultiplying this matrix by + * the supplied argument. If this of size AxB (A rows and B columns), and the + * argument is CxA (C rows and A columns), the result is of size CxB. * * @param in - * DOCUMENT ME! * - * @return DOCUMENT ME! + * @return + * @throws IllegalArgumentException + * if the number of columns in the pre-multiplier is not equal to + * the number of rows in the multiplicand (this) */ public Matrix preMultiply(Matrix in) { + if (in.cols != this.rows) + { + throw new IllegalArgumentException("Can't pre-multiply " + this.rows + + " rows by " + in.cols + " columns"); + } double[][] tmp = new double[in.rows][this.cols]; for (int i = 0; i < in.rows; i++) @@ -137,16 +154,14 @@ public class Matrix } } - return new Matrix(tmp, in.rows, this.cols); + return new Matrix(tmp); } /** - * DOCUMENT ME! * * @param in - * DOCUMENT ME! * - * @return DOCUMENT ME! + * @return */ public double[] vectorPostMultiply(double[] in) { @@ -166,37 +181,34 @@ public class Matrix } /** - * DOCUMENT ME! + * Returns a new matrix which is the result of postmultiplying this matrix by + * the supplied argument. If this of size AxB (A rows and B columns), and the + * argument is BxC (B rows and C columns), the result is of size AxC. + *

+ * This method simply returns the result of in.preMultiply(this) * * @param in - * DOCUMENT ME! * - * @return DOCUMENT ME! + * @return + * @throws IllegalArgumentException + * if the number of rows in the post-multiplier is not equal to the + * number of columns in the multiplicand (this) + * @see #preMultiply(Matrix) */ public Matrix postMultiply(Matrix in) { - double[][] out = new double[this.rows][in.cols]; - - for (int i = 0; i < this.rows; i++) + if (in.rows != this.cols) { - for (int j = 0; j < in.cols; j++) - { - out[i][j] = 0.0; - - for (int k = 0; k < rows; k++) - { - out[i][j] = out[i][j] + (value[i][k] * in.value[k][j]); - } - } + throw new IllegalArgumentException("Can't post-multiply " + this.cols + + " columns by " + in.rows + " rows"); } - - return new Matrix(out, this.cols, in.rows); + return in.preMultiply(this); } /** - * DOCUMENT ME! + * Answers a new matrix with a copy of the values in this one * - * @return DOCUMENT ME! + * @return */ public Matrix copy() { @@ -204,13 +216,10 @@ public class Matrix for (int i = 0; i < rows; i++) { - for (int j = 0; j < cols; j++) - { - newmat[i][j] = value[i][j]; - } + System.arraycopy(value[i], 0, newmat[i], 0, value[i].length); } - return new Matrix(newmat, rows, cols); + return new Matrix(newmat); } /** @@ -738,20 +747,19 @@ public class Matrix } /** - * DOCUMENT ME! + * Returns an array containing the values in the specified column * - * @param n - * DOCUMENT ME! + * @param col * - * @return DOCUMENT ME! + * @return */ - public double[] getColumn(int n) + public double[] getColumn(int col) { double[] out = new double[rows]; for (int i = 0; i < rows; i++) { - out[i] = value[i][n]; + out[i] = value[i][col]; } return out; @@ -784,85 +792,4 @@ public class Matrix Format.print(ps, "%15.4e", e[j]); } } - - /** - * DOCUMENT ME! - * - * @param args - * DOCUMENT ME! - */ - public static void main(String[] args) throws Exception - { - int n = Integer.parseInt(args[0]); - double[][] in = new double[n][n]; - - for (int i = 0; i < n; i++) - { - for (int j = 0; j < n; j++) - { - in[i][j] = (double) Math.random(); - } - } - - Matrix origmat = new Matrix(in, n, n); - - // System.out.println(" --- Original matrix ---- "); - // / origmat.print(System.out); - // System.out.println(); - // System.out.println(" --- transpose matrix ---- "); - Matrix trans = origmat.transpose(); - - // trans.print(System.out); - // System.out.println(); - // System.out.println(" --- OrigT * Orig ---- "); - Matrix symm = trans.postMultiply(origmat); - - // symm.print(System.out); - // System.out.println(); - // Copy the symmetric matrix for later - // Matrix origsymm = symm.copy(); - - // This produces the tridiagonal transformation matrix - // long tstart = System.currentTimeMillis(); - symm.tred(); - - // long tend = System.currentTimeMillis(); - - // System.out.println("Time take for tred = " + (tend-tstart) + "ms"); - // System.out.println(" ---Tridiag transform matrix ---"); - // symm.print(System.out); - // System.out.println(); - // System.out.println(" --- D vector ---"); - // symm.printD(System.out); - // System.out.println(); - // System.out.println(" --- E vector ---"); - // symm.printE(System.out); - // System.out.println(); - // Now produce the diagonalization matrix - // tstart = System.currentTimeMillis(); - symm.tqli(); - // tend = System.currentTimeMillis(); - - // System.out.println("Time take for tqli = " + (tend-tstart) + " ms"); - // System.out.println(" --- New diagonalization matrix ---"); - // symm.print(System.out); - // System.out.println(); - // System.out.println(" --- D vector ---"); - // symm.printD(System.out); - // System.out.println(); - // System.out.println(" --- E vector ---"); - // symm.printE(System.out); - // System.out.println(); - // System.out.println(" --- First eigenvector --- "); - // double[] eigenv = symm.getColumn(0); - // for (int i=0; i < eigenv.length;i++) { - // Format.print(System.out,"%15.4f",eigenv[i]); - // } - // System.out.println(); - // double[] neigenv = origsymm.vectorPostMultiply(eigenv); - // for (int i=0; i < neigenv.length;i++) { - // Format.print(System.out,"%15.4f",neigenv[i]/symm.d[0]); - // } - // System.out.println(); - } }