Эйген: разделить каждый ряд на последний ряд
Я не могу понять синтаксис для этого при использовании Эйгена 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()
.
Однако я согласен, что, похоже, было бы полезно иметь для этого готовый метод.