org.ejml.ops.MatrixIO Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of ejml-core Show documentation
Show all versions of ejml-core Show documentation
A fast and easy to use dense and sparse matrix linear algebra library written in Java.
/*
* Copyright (c) 2009-2018, Peter Abeles. All Rights Reserved.
*
* This file is part of Efficient Java Matrix Library (EJML).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.ejml.ops;
import org.ejml.data.*;
import java.io.*;
/**
* Provides simple to use routines for reading and writing matrices to and from files.
*
* @author Peter Abeles
*/
public class MatrixIO {
/**
* Saves a matrix to disk using Java binary serialization.
*
* @param A The matrix being saved.
* @param fileName Name of the file its being saved at.
* @throws java.io.IOException
*/
public static void saveBin(DMatrix A, String fileName)
throws IOException
{
FileOutputStream fileStream = new FileOutputStream(fileName);
ObjectOutputStream stream = new ObjectOutputStream(fileStream);
try {
stream.writeObject(A);
stream.flush();
} finally {
// clean up
try {
stream.close();
} finally {
fileStream.close();
}
}
}
/**
* Loads a {@link DMatrix} which has been saved to file using Java binary
* serialization.
*
* @param fileName The file being loaded.
* @return DMatrixRMaj
* @throws IOException
*/
public static T loadBin(String fileName)
throws IOException
{
FileInputStream fileStream = new FileInputStream(fileName);
ObjectInputStream stream = new ObjectInputStream(fileStream);
T ret;
try {
ret = (T)stream.readObject();
if( stream.available() != 0 ) {
throw new RuntimeException("File not completely read?");
}
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
stream.close();
return (T)ret;
}
/**
* Saves a matrix to disk using in a Column Space Value (CSV) format. For a
* description of the format see {@link MatrixIO#loadCSV(String,boolean)}.
*
* @param A The matrix being saved.
* @param fileName Name of the file its being saved at.
* @throws java.io.IOException
*/
public static void saveDenseCSV(DMatrix A , String fileName )
throws IOException
{
PrintStream fileStream = new PrintStream(fileName);
fileStream.println(A.getNumRows() + " " + A.getNumCols() + " real");
for( int i = 0; i < A.getNumRows(); i++ ) {
for( int j = 0; j < A.getNumCols(); j++ ) {
fileStream.print(A.get(i,j)+" ");
}
fileStream.println();
}
fileStream.close();
}
/**
* Saves a matrix to disk using in a Column Space Value (CSV) format. For a
* description of the format see {@link MatrixIO#loadCSV(String,boolean)}.
*
* @param A The matrix being saved.
* @param fileName Name of the file its being saved at.
* @throws java.io.IOException
*/
public static void saveSparseCSV(DMatrixSparseTriplet A , String fileName )
throws IOException
{
PrintStream fileStream = new PrintStream(fileName);
fileStream.println(A.getNumRows() + " " + A.getNumCols() +" "+A.nz_length+ " real");
for (int i = 0; i < A.nz_length; i++) {
DMatrixSparseTriplet.Element e = A.nz_data[i];
fileStream.println(e.row+" "+e.col+" "+e.value);
}
fileStream.close();
}
/**
* Saves a matrix to disk using in a Column Space Value (CSV) format. For a
* description of the format see {@link MatrixIO#loadCSV(String,boolean)}.
*
* @param A The matrix being saved.
* @param fileName Name of the file its being saved at.
* @throws java.io.IOException
*/
public static void saveSparseCSV(FMatrixSparseTriplet A , String fileName )
throws IOException
{
PrintStream fileStream = new PrintStream(fileName);
fileStream.println(A.getNumRows() + " " + A.getNumCols() +" "+A.nz_length+ " real");
for (int i = 0; i < A.nz_length; i++) {
FMatrixSparseTriplet.Element e = A.nz_data[i];
fileStream.println(e.row+" "+e.col+" "+e.value);
}
fileStream.close();
}
/**
* Reads a matrix in which has been encoded using a Column Space Value (CSV)
* file format. The number of rows and columns are read in on the first line. Then
* each row is read in the subsequent lines.
*
* Works with dense and sparse matrices.
*
* @param fileName The file being loaded.
* @return DMatrix
* @throws IOException
*/
public static T loadCSV(String fileName , boolean doublePrecision )
throws IOException
{
FileInputStream fileStream = new FileInputStream(fileName);
ReadMatrixCsv csv = new ReadMatrixCsv(fileStream);
T ret;
if( doublePrecision )
ret = csv.read64();
else
ret = csv.read32();
fileStream.close();
return ret;
}
/**
* Reads a matrix in which has been encoded using a Column Space Value (CSV)
* file format. For a description of the format see {@link MatrixIO#loadCSV(String,boolean)}.
*
* @param fileName The file being loaded.
* @param numRows number of rows in the matrix.
* @param numCols number of columns in the matrix.
* @return DMatrixRMaj
* @throws IOException
*/
public static DMatrixRMaj loadCSV(String fileName , int numRows , int numCols )
throws IOException
{
FileInputStream fileStream = new FileInputStream(fileName);
ReadMatrixCsv csv = new ReadMatrixCsv(fileStream);
DMatrixRMaj ret = csv.readDDRM(numRows, numCols);
fileStream.close();
return ret;
}
public static void print( PrintStream out , DMatrix mat ) {
print(out,mat,6,3);
}
public static void print(PrintStream out, DMatrix mat , int numChar , int precision ) {
String format = "%"+numChar+"."+precision+"f";
print(out, mat,format);
}
public static void print(PrintStream out , DMatrix mat , String format ) {
String type = ReshapeMatrix.class.isAssignableFrom(mat.getClass()) ? "dense64" : "dense64 fixed";
out.println("Type = "+type+" real , numRows = "+mat.getNumRows()+" , numCols = "+mat.getNumCols());
format += " ";
for( int y = 0; y < mat.getNumRows(); y++ ) {
for( int x = 0; x < mat.getNumCols(); x++ ) {
out.printf(format,mat.get(y,x));
}
out.println();
}
}
public static void printJava(PrintStream out , DMatrix mat , String format ) {
String type = mat.getType().getBits() == 64 ? "double" : "float";
out.println("new "+type+"[][]{");
format += " ";
for( int y = 0; y < mat.getNumRows(); y++ ) {
out.print("{");
for( int x = 0; x < mat.getNumCols(); x++ ) {
out.printf(format,mat.get(y,x));
if( x+1