Эйген: разделить каждый ряд на последний ряд

Я не могу понять синтаксис для этого при использовании Эйгена rowwise операции...

У меня есть собственная матрица, и я хочу разделить каждую строку на последнюю строку. Так что, если мы начали с матрицы

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

тогда после этого преобразования я хочу иметь

r = [  0, .2
      .5, .6
       1,  1 ]

Желательно, чтобы операция происходила на месте, перезаписывая r, Кроме того, я не буду использовать значения в последнем ряду, поэтому не имеет значения, является ли последний ряд фактически единицами после преобразования.

Вот некоторые синтаксисы, которые я пробовал, которые не компилируются:

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-loop работает

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 оператор?

3 ответа

Решение

Для завершения самостоятельного ответа, если вам не нужна последняя строка, вы можете использовать hnormalized:

result = r.colwise().hnormalized()

и с Eigen багажник вы также можете написать:

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

Конечно, я наконец-то нашел правильный синтаксис после публикации...

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

По какой-то причине, используя bottomRows здесь приводит к ошибке компиляции. То есть следующее не компилируется

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

Если вам нужна последняя строка, естьr.colwise().hnormalized().colwise().homogeneous().

Однако я согласен, что, похоже, было бы полезно иметь для этого готовый метод.

Другие вопросы по тегам