c++ 如何循环移动2D本征阵列?

9q78igpj  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(117)

什么是最好的(我的意思是最快和/或最有效的)方法来执行一个2D本征阵列的循环移位?
例如,我想循环向右移动ArrayXXd。我想我可以做如下事情:

circShiftRight (ArrayXXd &arraytoshift)
{
    Matrix<double, Dynamic, 1> tmp;

    tmp = arraytoshift.col (arraytoshift.cols ()-1);

    arraytoshift.rightCols(_radForceVelocity.cols()-1) = arraytoshift.leftCols(_radForceVelocity.cols()-1).eval ();

    arraytoshift.col(0) = tmp;
}

但这行得通吗?有没有更好的办法?我假设.eval()是避免Aliasing所必需的。我是第一次使用Eigen图书馆。

0ejtzxu1

0ejtzxu11#

在互联网上搜索了一段时间的相关问题后(实际上我正在寻找一种从矩阵中删除列/行的方法),我无法找到一个令人满意的答案,关于如何使用Eigen实现有效的行/列移位,所以我自己调查。
正如我已经怀疑的那样,锯齿只是一个方向的问题,而另一个方向是安全的。更具体地说:当向左/向上移动矩阵的列/行时,别名不是问题。无论矩阵是行为主还是列为主,这都是正确的。然而,当向右或向下移动时,有必要制作中间副本。这意味着在向右/向下移位时避免临时的唯一方法是以顺序for循环风格逐列/逐行执行移位,这可能比在临时中复制整个原始矩阵然后一次性分配尽可能多的列/行要慢。
此行为来自执行低级赋值的方式。我不确定它是官方文档的一部分还是实现细节,但我很确定我已经在Eigen本身的某个地方看到了这种边缘情况,以避免副本,所以它很可能在未来保持这种状态。

相关问题