c++ - 映射与 block 不一致的特征矩阵引用对象

标签 c++ eigen

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

也就是说,我正在尝试使用矩阵 block 。我知道可以使用返回 Eigen::BlockEigen::Ref 对象的 block 方法轻松访问它们。下面我尝试使用 Ref 对象。我想 Map Eigen::MatrixXd block 。但是,我似乎无法跨列进行映射,而只能映射列中的连续元素(我认为这是面向列的数据的结果)。您可以在下面看到输出的差异。

我有什么方法可以映射 Eigen::MatrixXd 的 block 吗?

#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

最佳答案

除非另有说明,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 对象的外部步幅来为 map 指定它:

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

关于c++ - 映射与 block 不一致的特征矩阵引用对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34513416/

相关文章:

c++ - 在将节点读入链接列表后,我的程序不断循环并仅重复显示一个节点。有人可以帮我改正吗?

c++ - 向 Wt WTable 小部件添加网格线

c++ - Eigen :高效克罗内克积

OpenCV CalcPca 输入数据

python - 如何在 Windows 上使用 EIGEN 安装 opencv-contrib-python?

C++ : Initializing vector based on constructor param

c++ - 什么是 undefined reference /未解析的外部符号错误以及如何修复它?

c++ - 如何像Canvas globalCompositeOperation那样模拟更亮的效果?

c++ - 如何在 Eigen C++ 中对称化稀疏矩阵?

c++ - 模板库的编译器内存消耗(boost + Eigen)