映射与块不一致的特征矩阵参考对象
Mapping Eigen Matrix Ref objects not consistent with blocks
快速上下文,我正在使用另一个 C++ 库,该库具有需要常规或映射特征矩阵的函数。我想使用映射版本来避免复制的内存开销。
就是说,我正在尝试使用矩阵块。我知道可以使用返回 Eigen::Block
或 Eigen::Ref
对象的 block
方法轻松访问这些内容。下面我尝试使用 Ref
对象。我想 Map
Eigen::MatrixXd
块。但是,我似乎无法跨列进行映射,而只能映射列中的连续元素(我认为这是面向列的数据的结果)。您可以在下面看到输出的差异。
我有什么方法可以 Map
一块 Eigen::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
除非另有说明,否则 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()));
快速上下文,我正在使用另一个 C++ 库,该库具有需要常规或映射特征矩阵的函数。我想使用映射版本来避免复制的内存开销。
就是说,我正在尝试使用矩阵块。我知道可以使用返回 Eigen::Block
或 Eigen::Ref
对象的 block
方法轻松访问这些内容。下面我尝试使用 Ref
对象。我想 Map
Eigen::MatrixXd
块。但是,我似乎无法跨列进行映射,而只能映射列中的连续元素(我认为这是面向列的数据的结果)。您可以在下面看到输出的差异。
我有什么方法可以 Map
一块 Eigen::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
除非另有说明,否则 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()));