【问题标题】:Resize Matrix upwards and left with Eigen Library使用特征库向上和向左调整矩阵大小
【发布时间】:2018-07-02 12:19:30
【问题描述】:

我正在尝试使用我们可以说的负索引来调整矩阵的大小,这意味着它们应该从该矩阵的原点 (0,0) 向左和向上。我试过 grid.resize(-20,-20) 但它不起作用。

任何想法都是有用的。谢谢!

【问题讨论】:

  • 就索引而言,我能理解您的意思(请参阅 NumPy),但就调整大小而言,我真的不明白您的意思吗?它是一个大小,它只能是正数(或者可能是我不知道这个轴的一些别名,从总大小中得出)
  • 是的,大小应该是正的,我只是表示需要初始矩阵保持在右下角,因为我打算向上和向左调整它的大小。
  • 我认为默认情况下这是不可能的,因为它涉及调整大小然后将现有项目移动到最后。如果你真的需要这个操作,你可以自己轻松完成。
  • 是的,创建一个具有所需大小的新矩阵可能更容易,将原始矩阵复制到新矩阵的右下角并删除原始矩阵。
  • grid.resize(-20,-20) 应该断言(如果编译时没有-DNDEBUG)。 resize 不会保留原始内容,如果有的话,conservativeResize 会起作用(但这将始终将原始内容保留在左上角)。

标签: c++ matrix eigen


【解决方案1】:

这无论如何都不能就地完成,所以只需创建一个新的(足够大的)矩阵,将原始矩阵复制到更大的矩阵并移动/交换矩阵。示例实现(可以概括为 LeftDown/RightUp/... - 此实现还假设 upleft 是非负数):

template<class Derived>
void resizeUpLeft(Eigen::DenseBase<Derived>& mat, Eigen::Index up, Eigen::Index left)
{
    typename Derived::PlainObject biggerMat(mat.rows()+up, mat.cols()+left);
    // Note: biggerMat will be filled with uninitialized values,
    // use setZero, if that is not desired
    // if allocation of biggerMat fails mat stays unchanged
    biggerMat.bottomRightCorner(mat.rows(), mat.cols()) = mat;
    // move or swap to avoid copy:
    mat.derived() = std::move(biggerMat);
    // with C++03:
    // mat.derived().swap(biggerMat);
}

【讨论】:

  • 谢谢!这正是我想要的
猜你喜欢
  • 2012-08-08
  • 1970-01-01
  • 2020-07-29
  • 1970-01-01
  • 2018-10-31
  • 2011-09-29
  • 2019-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多