特征:将每一行除以最后一行

时间:2018-02-22 15:18:31

标签: c++ eigen eigen3

使用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);

这个简单的旧循环版本可以使用

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运算符是否有我想要做的简洁形式?

2 个答案:

答案 0 :(得分:2)

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

result = r.colwise().hnormalized()

和Eigen trunk你也可以写:

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

答案 1 :(得分:1)

当然,我终于在发布后找到了正确的语法......

int last_row = r.rows() - 1;
r.array().rowwise() /= r.row(last_row).array();

出于某种原因,在这里使用bottomRows会导致编译错误。也就是说,以下内容无法编译

r.array().rowwise() /= r.bottomRows(1).array();