映射特征矩阵Ref对象与块不一致
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()));
相关文章:
- 大于65535的C++数组[size]引发不一致的溢出
- 在 C++(和 C)中进行类型转换时明显不一致
- 填充上编译器生成的复制构造函数之间的不一致
- 如何在不销毁对象的情况下返回对象列表
- 犰狳的 print() 方法和 cout 在从 Rcpp 调用时顺序不一致
- 当 std::move 与 C 样式数组或不移动对象时会发生什么
- CreateDIBSection为同一图像返回不一致的位图位值
- 通用参考 l 值不复制对象
- 在 Qml 中从 QSqlTableModel 中删除单行时视图不一致
- 模板参数推导不一致
- 如何在类中递增单独的变量,而不是对象本身?
- 声明中不一致的no是否违反ODR?
- 如何删除分支因子不一致的树,最大为 30,40
- 需要实例化不同类/对象并在启动时确定的硬件插槽的设计模式
- 从 C++ 函数与 Python 函数返回的不一致值用于偏斜正态分布
- 从 C 字符串构造 std::string 与从另一个 std::string 构造 std::string 不一致
- 这种比较是否不一致(或者存在其他问题)?
- 以下可变参数模板行为是否不一致?
- 从与对象大小不一致的连续固定大小缓冲区解析对象的有效方法
- 映射特征矩阵Ref对象与块不一致