2015-12-29 38 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