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

问题描述 投票:0回答:3

使用 Eigen 的

rowwise
操作时,我不太清楚其语法...

我有一个特征矩阵,我想将每一行除以最后一行。所以如果我们从一个矩阵开始

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();
}

然而,无论我走到哪里,人们都提倡使用

rowwise
colwise
操作。我无法让它与该语法一起工作。我想要使用
rowwise
运算符执行的操作是否有一种简洁的形式?

c++ eigen eigen3
3个回答
5
投票

要完成自答,如果不需要最后一行,可以使用 hnormalized:

result = r.colwise().hnormalized()

并且使用 Eigen trunk 你还可以写:

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

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()

不过,我同意,使用就地方法来执行此操作似乎很有用。

© www.soinside.com 2019 - 2024. All rights reserved.