文章目录
0. 引言
\qquad
Numpy和Eigen分别是Python和C++常用的矩阵操作工具,本文旨在说明两个库保存的矩阵格式如何相互读入。本文先介绍二者对自身格式矩阵的读写,然后再介绍它们如何相互读取各自保存的矩阵。
1. Eigen矩阵的读写
1.1. Eigen矩阵写入
\qquad
Eigen矩阵重载了”<<“运算符,因此可以直接通过<<一次性写入fstream文件流,一个简单的例子如下:
#include <fstream>
Eigen::Matrix4d mat = Eigen::Matrix4d::Identity();
std::string filename = "test.bin"; // 后缀不重要
std::ofstream outfile(filename, std::ios::ate | std::ios::binary); // std::ios::ate是写模式, std::ios::binary是二进制模式
outfile << mat; // Eigen矩阵一次性写入文件
outfile.close();
1.2. Eigen矩阵读入
\qquad
Eigen矩阵读入时不可以一次性读入。准确来说,Eigen矩阵保存时是按照double类型以二进制形式写入的,矩阵每个元素之间保留空格。因此读入时按照元素对矩阵进行赋值,赋值前需要知道矩阵维度。
#include <fstream>
Eigen::Matrix4d mat;
std::string filename = "test.bin"; // 后缀不重要
std::ifstream infile(filename, std::ios::binary); // std::ios::binary是二进制模式
for(int i=0;i<4;++i){
for(int j=0;j<4;++j){
infile >> mat(i,j); //先列后行赋值
}
}
infile.close();
2. Numpy矩阵读写
2.1. Numpy矩阵读入
\qquad
Numpy矩阵可以直接通过np.savez, np.save等函数矩阵读入,但是本文不是介绍这种,而是介绍与Eigen矩阵更加类似的二级制写入方式:
import numpy as np
import ctypes
a = np.eye(4).astype(ctypes.c_float64) # double类型的numpy数组
a.tofile("test.bin",sep=" ") # 二进制写入,空格作为分割符号
2.2. Numpy矩阵读入
\qquad
Numpy可以通过fromfile将二进制文件读入为numpy矩阵:
import numpy as np
a = np.fromfile("test.bin",sep=" ").reshape(4,4) # 需要知晓维度
3. 相互读写
\qquad
由于二进制文件的兼容性,1.1, 1.2, 2.1, 2.2节两两组合即完成了Eigen与Numpy的相互转化,即通过2.2写入的test.bin文件可通过1.1的Eigen方法读入,而1.2写入的Eigen矩阵也可通过2.1介绍的Numpy读入方法读进来。
希望本文对您有帮助,谢谢阅读