要将Eigen :: Matrix写入文件我真的很想使用以下内容:
typedef Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> Matrix_MxN;
Matrix_MxN J = Matrix_MxN::Zeros(10,10);
std::ofstream("matrix.txt") << J;
但不幸的是,没有定义可以做相反的事情:
std::ifstream("matrix.txt") >> J;
为了解决这个问题,如何将Eigen :: Matrix读/写为二进制文件?
答案 0 :(得分:12)
您可以定义以下方法:
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::
您可以使用以下方式测试其使用情况:
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();'
如果您了解更好的方法,欢迎提出建议!
答案 1 :(得分:0)
进行修改以避免入侵命名空间本征, 将zlib用于更大的矩阵。
#include <string>
#include <zlib.h>
#include <Eigen/Core>
namespace myEigen{
template<class Derived>
void write_binary(const std::string &filename,
const Eigen::PlainObjectBase<Derived> &matrix)
{
typedef typename Derived::Index Index;
typedef typename Derived::Scalar Scalar;
gzFile out = gzopen(filename.c_str(), "wb");
Index rows=matrix.rows(), cols=matrix.cols();
gzwrite(out, (char*) (&rows), sizeof(Index));
gzwrite(out, (char*) (&cols), sizeof(Index));
gzwrite(out, (char*) matrix.data(), rows*cols*sizeof(Scalar) );
gzclose(out);
}
template<class Derived>
void read_binary(const std::string &filename,
Eigen::PlainObjectBase<Derived> &matrix)
{
typedef typename Derived::Index Index;
typedef typename Derived::Scalar Scalar;
gzFile in = gzopen(filename.c_str(), "rb");
Index rows=0, cols=0;
gzread(in, (char*) (&rows),sizeof(Index));
gzread(in, (char*) (&cols),sizeof(Index));
matrix.resize(rows, cols);
gzread(in, (char*) matrix.data(), rows*cols*sizeof(Scalar) );
gzclose(in);
}
} // myEigen::
答案 2 :(得分:-1)
我认为read_binary()
方法中缺少一行。在第一个in.seekg(0, in.beg);
行之前应该有一个in.read((*char))
。