package edu.berkeley.nlp.math; public class DoubleMatrices { /** * Returns the matrix transpose. Assumes a non-empty rectangular matrix. */ public static double[][] transpose(double[][] A) { double[][] B = new double[A[0].length][A.length]; for (int i=0; i<B.length; i++) { for (int j=0; j<B[0].length; j++) { B[i][j] = A[j][i]; } } return B; } /** * Extracts column j and returns it as a single array. Assumes a non-empty rectangular matrix. */ public static double[] getColumnVector(double[][] A, int j) { double[] v = new double[A.length]; for (int i=0; i<v.length; i++) { v[i] = A[i][j]; } return v; } /** * Returns the standard matrix product of two double matrices. */ public static double[][] product(double[][] A, double[][] B) { if (A[0].length != B.length) throw new RuntimeException("cols in A (" + A.length + ") differs from rows in B ( " + B.length + ")"); double[][] C = new double[A.length][B[0].length]; for (int i=0; i<A.length; i++) { for (int j=0; j<B[0].length; j++) { C[i][j] = DoubleArrays.innerProduct(A[i], DoubleMatrices.getColumnVector(B, j)); } } return C; } public static double add(double[][] m) { double sum = 0.0; for (double[] row : m) { sum += DoubleArrays.add(row); } return sum; } /** * Returns the matrix product v * B (v is treated as a row vector) */ public static double[] product(double[] v, double[][] B) { double[][] A = new double[1][]; A[0] = v; return product(A, B)[0]; } /** * Returns the matrix product A * v (v is treated as a column vector) */ public static double[] product(double[][] A, double[] v) { double[][] B = new double[1][]; B[0] = v; return transpose(product(A, transpose(B)))[0]; } public static void normalizeEachRow(double[][] M) { for (double[] row : M) { DoubleArrays.probabilisticNormalize(row); } } public static void scale(double[][] M, double scale) { for (double[] row : M) { DoubleArrays.scale(row,scale); } } public static double[][] constantMatrix(double c, int m, int n) { double[][] M = new double[m][n]; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { M[i][j] = c; } } return M; } }