// Copyright (C) 2010, 2011 Zeno Gantner, Chris Newell // // This file is part of MyMediaLite. // // MyMediaLite is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // MyMediaLite is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with MyMediaLite. If not, see <http://www.gnu.org/licenses/>. package org.mymedialite.io; import java.io.BufferedReader; import java.io.PrintWriter; import java.io.IOException; import java.io.PrintWriter; import java.util.List; import org.mymedialite.datatype.IMatrix; import org.mymedialite.datatype.Matrix; import org.mymedialite.datatype.Pair; import org.mymedialite.datatype.SparseMatrix; /** * Utilities to work with matrices. * @version 2.03 */ public class IMatrixExtensions { /** * Write a matrix to a PrintWriter object. * @param writer a PrintWriter * @param matrix the matrix to write out */ public static void writeMatrix(PrintWriter writer, IMatrix<?> matrix) { writer.println(matrix.numberOfRows() + " " + matrix.numberOfColumns()); for (int i = 0; i < matrix.numberOfRows(); i++) { for (int j = 0; j < matrix.numberOfColumns(); j++) { writer.println(i + " " + j + " " + matrix.get(i, j)); } } } /** * Write a sparse matrix of doubles to a PrintWriter object. * @param writer a PrintWriter * @param matrix the matrix of doubles to write out */ public static void writeSparseMatrix(PrintWriter writer, SparseMatrix<?> matrix) { writer.println(matrix.numberOfRows() + " " + matrix.numberOfColumns()); for (Pair<Integer, Integer> index_pair : matrix.nonEmptyEntryIDs()) writer.println(index_pair.first + " " + index_pair.second + " " + matrix.get(index_pair.first, index_pair.second)); } /** * Read a matrix from a BufferedReader object. * @param reader the BufferedReader object to read from * @param example_matrix matrix of the type of matrix to create * @return a matrix of doubles */ public static IMatrix<Double> readDoubleMatrix(BufferedReader reader, IMatrix<Double> example_matrix) throws IOException { String[] numbers = reader.readLine().split(" "); int dim1 = Integer.parseInt(numbers[0]); int dim2 = Integer.parseInt(numbers[1]); IMatrix<Double> matrix = example_matrix.createMatrix(dim1, dim2); int length = dim1 * dim2; for (int n = 0; n < length; n++) { String line = reader.readLine(); numbers = line.split(" "); if(numbers.length != 3) throw new IOException("Expected three fields: " + line); int i = Integer.parseInt(numbers[0]); int j = Integer.parseInt(numbers[1]); double v = Double.parseDouble(numbers[2]); if (i >= dim1) throw new IOException("i = " + i + " >= " + dim1); if (j >= dim2) throw new IOException("j = " + j + " >= " + dim2); matrix.set(i, j, v); } return matrix; } /** * Read a matrix from a BufferedReader object. * @param reader the BufferedReader object to read from * @param example_matrix matrix of the type of matrix to create * @return a matrix of float */ public static IMatrix<Float> readFloatMatrix(BufferedReader reader, IMatrix<Float> example_matrix) throws IOException { String[] numbers = reader.readLine().split(" "); int dim1 = Integer.parseInt(numbers[0]); int dim2 = Integer.parseInt(numbers[1]); IMatrix<Float> matrix = example_matrix.createMatrix(dim1, dim2); int length = dim1 * dim2; for (int n = 0; n < length; n++) { String line = reader.readLine(); numbers = line.split(" "); if(numbers.length != 3) throw new IOException("Expected three fields: " + line); int i = Integer.parseInt(numbers[0]); int j = Integer.parseInt(numbers[1]); Float v = Float.parseFloat(numbers[2]); if (i >= dim1) throw new IOException("i = " + i + " >= " + dim1); if (j >= dim2) throw new IOException("j = " + j + " >= " + dim2); matrix.set(i, j, v); } return matrix; } /** * Read a matrix of integers from a BufferedReader object. * @param reader the BufferedReader object to read from * @param example_matrix matrix of the type of matrix to create * @return a matrix of integers */ static public IMatrix<Integer> readIntegerMatrix(BufferedReader reader, IMatrix<Integer> example_matrix) throws IOException { String[] numbers = reader.readLine().split(" "); int dim1 = Integer.parseInt(numbers[0]); int dim2 = Integer.parseInt(numbers[1]); IMatrix<Integer> matrix = example_matrix.createMatrix(dim1, dim2); int length = dim1 * dim2; for (int n = 0; n < length; n++) { String line = reader.readLine(); numbers = line.split(" "); if(numbers.length != 3) throw new IOException("Expected three fields: " + line); int i = Integer.parseInt(numbers[0]); int j = Integer.parseInt(numbers[1]); Integer v = Integer.parseInt(numbers[2]); if (i >= dim1) throw new IOException("i = " + i + " >= " + dim1); if (j >= dim2) throw new IOException("j = " + j + " >= " + dim2); matrix.set(i, j, v); } return matrix; } }