【问题标题】:Eigen: Divide each row by last row特征:将每一行除以最后一行
【发布时间】:2018-02-22 15:18:31
【问题描述】:

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

但是,无论我走到哪里,人们都在提倡使用rowwisecolwise 操作。我无法让它与该语法一起使用。我想使用 rowwise 运算符做的事情有一个简洁的形式吗?

【问题讨论】:

    标签: c++ eigen eigen3


    【解决方案1】:

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

    result = r.colwise().hnormalized()
    

    使用 Eigen trunk 你也可以这样写:

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

    【讨论】:

    • 我很惊讶没有hnormalized() 的“就地”版本。
    【解决方案2】:

    当然,我发帖后终于找到正确的语法了……

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

    由于某种原因,在此处使用bottomRows 会导致编译错误。也就是下面的不编译

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-09
      • 2021-01-22
      • 2016-12-12
      相关资源
      最近更新 更多