如何从二进制文件中写入/读取特征矩阵

and*_*rea 6 c++ matrix eigen3

要将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;
Run Code Online (Sandbox Code Playgroud)

但不幸的是,没有定义可以做相反的事情:

std::ifstream("matrix.txt") >> J;
Run Code Online (Sandbox Code Playgroud)

为了避免这个问题,你如何读取/写入Eigen :: Matrix到二进制文件

and*_*rea 13

您可以定义以下方法:

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::
Run Code Online (Sandbox Code Playgroud)

你可以测试他们的用法:

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();'
Run Code Online (Sandbox Code Playgroud)

如果您知道更好的方法,欢迎提出建议!

  • 请注意,如果您将`Eigen`与另一个使用它的库(如`OpenCV`)一起使用,则会产生大量编译错误.一般来说,在库`namespace'中注入新函数并不是一个好主意. (4认同)