То, что вы намереваетесь сделать, это не что иное, как обычный цикл for:
for (int i = 0; i < vec.size(); ++i)
vec(i) *= i;
Так почему бы не сделать все просто? Если он должен использоваться для создания объектов, поместите его в вспомогательную функцию (шаблон).
Кроме того, что может сделать, так это полагаться на внутренний порядок оценки Эйгена. Кажется, это работает, но я не уверен, буду ли я полагаться на это:
struct CountingUnaryFct {
double operator()(double d) const { return d*index++; }
mutable int index = 0;
};
vec.unaryExpr(CountingUnaryFct{});
Это хак со значительным уродством, поскольку он обманывает шаблон unaryExpr
, который требует, чтобы его функциональный объект имел const
-квалифицированный член operator()(double) const
(невозможно с mutable
-lambda, следовательно, функция объект), чтобы принять экземпляр, который действительно изменяет свое состояние под капотом. Но опять же, похоже, он работает надежно, по крайней мере, на одномерных матрицах.