package util.linalg; /** * A diagonal matrix is a matrix that only has a diagonal * @author Andrew Guillory gtg008g@mail.gatech.edu * @version 1.0 */ public class DiagonalMatrix extends Matrix { /** * The m value */ private int m; /** * The n value */ private int n; /** * The diagonal values */ private double[] diagonal; /** * Make a new diagonal matrix * @param m the matrix */ public DiagonalMatrix(Matrix m) { this.m = m.m(); this.n = m.n(); this.diagonal = new double[Math.min(m.m(), m.n())]; for (int i = 0; i < diagonal.length; i++) { diagonal[i] = m.get(i,i); } } /** * Make a new diagonal matrix * @param m the number of rows * @param n the number of columns * @param diagonal the values */ public DiagonalMatrix(int m, int n, double[] diagonal) { this.m = m; this.n = n; this.diagonal = diagonal; } /** * @see util.linalg.Matrix#m() */ public int m() { return m; } /** * @see util.linalg.Matrix#n() */ public int n() { return n; } /** * @see util.linalg.Matrix#get(int, int) */ public double get(int i, int j) { if (i == j && i < diagonal.length) { return diagonal[i]; } else if (i > m || j > n) { throw new UnsupportedOperationException(); } else { return 0; } } /** * @see util.linalg.Matrix#set(int, int, double) */ public void set(int i, int j, double d) { if (i == j && i < diagonal.length) { diagonal[i] = d; } else if (d != 0 || i > m || j > n){ throw new UnsupportedOperationException(); } } /** * Get the inverse * @return the inverse */ public DiagonalMatrix inverse() { double[] newDiagonal = new double[diagonal.length]; for (int i = 0; i < diagonal.length; i++) { newDiagonal[i] = 1/diagonal[i]; } return new DiagonalMatrix(m, n, newDiagonal); } /** * Get the square root * @return the square root */ public DiagonalMatrix squareRoot() { double[] newDiagonal = new double[diagonal.length]; for (int i = 0; i < diagonal.length; i++) { newDiagonal[i] = Math.sqrt(diagonal[i]); } return new DiagonalMatrix(m, n, newDiagonal); } }