问题
To write Eigen::Matrix to file I really like to use the following:
typedef Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> Matrix_MxN;
Matrix_MxN J = Matrix_MxN::Zeros(10,10);
std::ofstream("matrix.txt") << J;
But unfortunately, something that can do the opposite is not defined:
std::ifstream("matrix.txt") >> J;
To circumvent this problem, how can you read/write an Eigen::Matrix to binary file instead?
回答1:
You can define these methods:
namespace Eigen{
template<class Matrix>
void write_binary(const char* filename, const Matrix& matrix){
std::ofstream out(filename, std::ios::out | std::ios::binary | std::ios::trunc);
typename Matrix::Index rows=matrix.rows(), cols=matrix.cols();
out.write((char*) (&rows), sizeof(typename Matrix::Index));
out.write((char*) (&cols), sizeof(typename Matrix::Index));
out.write((char*) matrix.data(), rows*cols*sizeof(typename Matrix::Scalar) );
out.close();
}
template<class Matrix>
void read_binary(const char* filename, Matrix& matrix){
std::ifstream in(filename, std::ios::in | std::ios::binary);
typename Matrix::Index rows=0, cols=0;
in.read((char*) (&rows),sizeof(typename Matrix::Index));
in.read((char*) (&cols),sizeof(typename Matrix::Index));
matrix.resize(rows, cols);
in.read( (char *) matrix.data() , rows*cols*sizeof(typename Matrix::Scalar) );
in.close();
}
} // Eigen::
and you can test their usage with:
typedef Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::ColMajor> Matrix_MxN;
Matrix_MxN J = Matrix_MxN::Random(10,5);
Eigen::write_binary("matrix.dat",J);
std::cout << "\n original \n" << J << std::endl;
Matrix_MxN J_copy;
Eigen::read_binary("matrix.dat",J_copy);
std::cout << "\n copy \n" << J_copy << std::endl;
cout.flush();'
If you know of a better way, suggestions are welcome!
回答2:
I think there is a line missing in the read_binary()
method. There should be an in.seekg(0, in.beg);
before the first in.read((*char))
line.
来源:https://stackoverflow.com/questions/25389480/how-to-write-read-an-eigen-matrix-from-binary-file