numpy与Eigen相互转换

文章目录

  • 0. 引言
  • 1. Eigen矩阵的读写
    • 1.1. Eigen矩阵写入
    • 1.2. Eigen矩阵读入
  • 2. Numpy矩阵读写
    • 2.1. Numpy矩阵读入
    • 2.2. Numpy矩阵读入
  • 3. 相互读写

0. 引言

\qquad Numpy和Eigen分别是Python和C++常用的矩阵操作工具,本文旨在说明两个库保存的矩阵格式如何相互读入。本文先介绍二者对自身格式矩阵的读写,然后再介绍它们如何相互读取各自保存的矩阵。

1. Eigen矩阵的读写

1.1. Eigen矩阵写入

\qquad Eigen矩阵重载了"<<"运算符,因此可以直接通过<<一次性写入fstream文件流,一个简单的例子如下:

#include 

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 

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读入方法读进来。

希望本文对您有帮助,谢谢阅读

你可能感兴趣的:(Python,C语言,numpy,python,C++,Eigen)