2015-12-29 36 views
1

快速背景下,我与有想到一个普通的或映射特征矩阵功能的另一个C++库的工作并不一致。我想使用映射版本来避免复制的内存开销。映射特征矩阵参考对象与块

这就是说,我想利用矩阵块工作。我知道这些可以通过block方法返回Eigen::BlockEigen::Ref对象来轻松访问。下面我正在尝试使用Ref对象。我想MapEigen::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 

回答

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())); 
+0

非常好,谢谢。 – cdeterman