Eigen::Matrix与array数据转换

本文介绍了如何在C++的Eigen库中进行Array和Matrix之间的转换。通过示例代码展示了数组到Eigen::Matrix的转换,以及Eigen::Matrix到数组的转换,并提供了更多的转化方法,帮助理解Eigen库中的数据操作。
摘要由CSDN通过智能技术生成

1. 数组转化为Eigen::Matrix

int array[9];

cout << "colMajor matrix = \n" << Map<Matrix3i>(array) << endl;                      // map a contiguous array as a column-major matrix
cout << "rowMajor matrix = \n" << Map<Matrix<int, 3, 3, RowMajor>>(array) << endl;   // map a contiguous array as a row-major matrix

Map<MatrixXi>  eigMat1(array, 3, 3);                     // eigMat1和array指向的是同一个内存空间,是绑定在一起的
MatrixXi       eigMat2 = Map<MatrixXi>(array, 3, 3);    //  eigMat1和array指向不同的内存空间,互不影响

 

2. Eigen::Matrix转化为数组

Matrix3d eigMat;

double* eigMatptr = eigMat.data();
double* eigMatptrnew = new double[eigMat.size()];
Map<MatrixXd>(eigMatptrnew, eigMat.rows(), eigMat.cols()) = eigMat;

 

3.更多转化

下面的代码是我写的互相转化的测试

#include <iostream>
#include <vector>
#include <Eigen/Dense>

using namespace std;
using namespace Eigen;

void array2eigenMat();
void eigenMat2array();

void array2eigenVec();
void eigenVec2array();

void vector2eigenMat();
void eigenMat2vector();

void vector2eigenVec();
void eigenVec2vector();


int main()
{
    cout << "hello world" <<endl;
    array2eigenMat();
    eigenMat2array();

    array2eigenVec();
    eigenVec2array();

    vector2eigenMat();
    eigenMat2vector();

    vector2eigenVec();
    eigenVec2vector();
    return 0;
}

void array2eigenMat()
{
    cout << "-------------------------- array2eigenMat  --------------------------" << endl;
    
    int array[9];
    for (int i = 0; i < 9; ++i) array[i] = i;
    cout << "array = [ "; for (int i = 0; i < 9; ++i) cout << array[i] << " "; cout << "]" << endl;

    cout << "colMajor matrix = \n" << Map<Matrix3i>(array) << endl;                     // map a contiguous array as a column-major matrix
    cout << "rowMajor matrix = \n" << Map<Matrix<int, 3, 3, RowMajor>>(array) << endl;  // map a contiguous array as a row-major matrix


    cout << "stride matrix = \n"
可以使用 Eigen::Tensor 代替循环实现计算所有 anchor boxes 的位置和大小。具体实现如下: ``` Eigen::Tensor<double, 2> oz = (Eigen::Tensor<double, 1>(D) * stride + offset).reshape(D, 1); Eigen::Tensor<double, 2> oh = (Eigen::Tensor<double, 1>(H) * stride + offset).reshape(1, H); Eigen::Tensor<double, 2> ow = (Eigen::Tensor<double, 1>(W) * stride + offset).reshape(1, 1, W); Eigen::Tensor<double, 3> anchors_tensor(1, anchors.size(), 3); for (int a = 0; a < anchors.size(); ++a) { anchors_tensor(0, a, 0) = anchors[a][0]; anchors_tensor(0, a, 1) = anchors[a][1]; anchors_tensor(0, a, 2) = anchors[a][2]; } Eigen::Tensor<double, 3> oz_tensor = oz.broadcast(Eigen::array<Eigen::Index, 3>({ 1, H, W })); Eigen::Tensor<double, 3> oh_tensor = oh.broadcast(Eigen::array<Eigen::Index, 3>({ D, 1, W })); Eigen::Tensor<double, 3> ow_tensor = ow.broadcast(Eigen::array<Eigen::Index, 3>({ D, H, 1 })); Eigen::Tensor<double, 4> windows_tensor = Eigen::Tensor<double, 4>(D, H, W, anchors.size(), 6); windows_tensor.chip(0, 3) = oz_tensor.reshape(D, H, W, 1).broadcast(Eigen::array<Eigen::Index, 4>({ 1, 1, 1, anchors.size() })); windows_tensor.chip(1, 3) = oh_tensor.reshape(D, H, W, 1).broadcast(Eigen::array<Eigen::Index, 4>({ 1, 1, 1, anchors.size() })); windows_tensor.chip(2, 3) = ow_tensor.reshape(D, H, W, 1).broadcast(Eigen::array<Eigen::Index, 4>({ 1, 1, 1, anchors.size() })); windows_tensor.chip(3, 3) = anchors_tensor.broadcast(Eigen::array<Eigen::Index, 4>({ D, H, W, 1 })); windows_tensor.chip(4, 3) = anchors_tensor.broadcast(Eigen::array<Eigen::Index, 4>({ D, H, W, 1 })).chip(0, 2) * anchors_tensor.broadcast(Eigen::array<Eigen::Index, 4>({ D, H, W, 1 })).chip(0, 2) / anchors_tensor.broadcast(Eigen::array<Eigen::Index, 4>({ D, H, W, 1 })).chip(0, 1); windows_tensor.chip(5, 3).setConstant(0.5); Eigen::ArrayXXd windows = windows_tensor.reshape(D * H * W * anchors.size(), 6).shuffle(Eigen::array<int, 2>({ 1, 0 })).matrix(); ``` 这段代码首先使用 Eigen::Tensor 构造 oz、oh 和 ow 三个张量,分别表示 D、H 和 W 个方向上 anchor boxes 的中心坐标。然后,代码使用 anchors 数组构造一个张量 anchors_tensor,用于表示所有 anchor boxes 的宽高和宽高比。 接下来,代码使用 broadcast() 方法将 oz、oh 和 ow 三个张量分别扩展到与 anchors_tensor 相同的维度。然后,代码使用 chip() 方法将扩展后的张量拼接成一个四维张量 windows_tensor,其中第四维有 6 个元素,分别表示中心坐标和宽高比。最后,代码使用 reshape() 和 shuffle() 方法将 windows_tensor 转换成一个二维矩阵 windows,并返回该矩阵。 相比于原来的循环实现,使用 Eigen::Tensor 的实现方式可以减少循环嵌套的层数,提高计算效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值