映射Eigen Matrix Ref对象与块不一致

时间:2015-12-29 14:48:12

标签: c++ eigen

快速上下文,我正在使用另一个C ++库,它具有期望常规或映射的特征矩阵的函数。我想使用映射版本来避免复制的内存开销。

那就是说,我正在尝试使用矩阵块。我知道可以使用block方法轻松访问这些内容,返回Eigen::BlockEigen::Ref对象。下面我尝试使用Ref对象。我想Map阻止Eigen::MatrixXd。但是,似乎我不能跨列映射,而只能在列中映射连续元素(我假设这是列导向数据的结果)。您可以在下面看到输出的差异。

我有MapEigen::MatrixXd

的方法吗?
#include <iostream>
#include <Eigen/Core>

int main()
{
    Eigen::MatrixXd A(3,3);
    A(0,0) = 1.0;
    A(0,1) = 2.0;
    A(0,2) = 3.0;
    A(1,0) = 4.0;
    A(1,1) = 5.0;
    A(1,2) = 6.0;
    A(2,0) = 7.0;
    A(2,1) = 8.0;
    A(2,2) = 9.0;

    std::cout << "source" << std::endl;
    std::cout << A << std::endl;

    Eigen::Ref<Eigen::MatrixXd> block = A.block(1,1,1,2);

    std::cout << "block" << std::endl;
    std::cout << block << std::endl;

    Eigen::Map<Eigen::MatrixXd> map(block.data(), block.rows(), block.cols());

    std::cout << "map" << std::endl;
    std::cout << map << std::endl;
}

输出:

source
1 2 3
4 5 6
7 8 9

block
5 6

map
5 8

1 个答案:

答案 0 :(得分:2)

除非另有说明,否则Eigen::Map采取单位步幅。 Ref对象的问题是步幅不是1.您可以按如下方式指定步幅(在本例中为外部):

Eigen::Map<Eigen::MatrixXd, 0, Eigen::OuterStride<> >
       map2(block.data(), block.rows(), block.cols(), Eigen::OuterStride<>(3));

std::cout << "map2" << std::endl;
std::cout << map2 << std::endl;

更好的是,您可以使用Ref对象的外部步幅为地图指定它:

Eigen::Map<Eigen::MatrixXd, 0, Eigen::OuterStride<> >
   map2(block.data(), block.rows(), block.cols(), Eigen::OuterStride<>(block.outerStride()));