Eigen:将每一行除以最后一行

4

在使用Eigen的rowwise操作时,我无法完全弄清楚其语法...

我有一个Eigen矩阵,希望将每一行除以最后一行。因此,如果我们从一个矩阵开始:

r = [ 0, 1
      2, 3 
      4, 5 ]

那么在这个转换之后,我希望得到的是:
r = [  0, .2
      .5, .6
       1,  1 ]

最好是在原地进行操作,覆盖r。此外,我不会使用最后一行的值,所以如果变换后最后一行实际上是1,也没有关系。
这里是我尝试过但无法编译的一些语法:
r.rowwise() = (r.array().rowwise() / r.bottomRows(1).array()).eval();
r.rowwise() = (r.rowwise().array() / r.bottomRows(1).array()).eval();
r.rowwise() /= r.bottomRows(1).array();
r = r.rowwise().cwiseQuotient(rrr);

这个传统的for循环版本可行

int last_row = r.rows() - 1;
for (int row = 0; row < last_row; ++row) {
    r.row(row).array() /= r.row(last_row).array();
}

然而,无论我去哪里,人们都在提倡使用rowwisecolwise操作。但是我无法用这种语法实现它。有没有一个漂亮简洁的形式可以使用rowwise运算符来实现我想要的功能?

3个回答

5

要完成自我回答,如果您不需要最后一行,则可以使用hnormalized

result = r.colwise().hnormalized()

使用Eigen trunk,您还可以编写以下内容:

using namespace Eigen::placeholders::last;
r.array().rowwise() /= r.row(last).array();

1
我很惊讶hnormalized()没有“原地”版本。 - wcochran

2
当然,在发布后我终于找到了正确的语法...
int last_row = r.rows() - 1;
r.array().rowwise() /= r.row(last_row).array();

由于某些原因,在此使用bottomRows会导致编译错误。也就是说,以下内容无法编译。
r.array().rowwise() /= r.bottomRows(1).array();

0
如果你确实需要最后一行,可以使用`r.colwise().hnormalized().colwise().homogeneous()`。
不过,我同意这似乎很有用,可以有一个原地方法来完成这个操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接