Можно ли начать индексирование матриц с 1 в Eigen? - PullRequest
0 голосов
/ 12 мая 2019

Я использую Eigen для выполнения некоторых вычислений линейной алгебры в моем коде. Однако все математические формулы основаны на том факте, что индексирование начинается с 1. Поэтому каждый раз, когда я хочу реализовать их в коде, я должен проверять, соответствует ли их индексирование в коде или нет. Мне было интересно, если это можно сказать Eigen, чтобы начать индексирование с 1 вместо 0.

Ответы [ 2 ]

2 голосов
/ 12 мая 2019

Операции индексирования в Eigen позволяют, помимо индексации целыми числами, индексировать с помощью символьных индексов. Вы должны иметь возможность реализовать свой собственный символьный индекс , полученный из Eigen::symbolic::BaseExpr, который можно использовать в качестве API индекса на основе 1, где его eval_impl метод просто вычитает 1 от его аргумента. E.g.:

template<typename Arg0>
class MyIndexExpr : public BaseExpr<MyIndexExpr<Arg0> >
{
public:
  MyIndexExpr(const Arg0& arg0) : m_arg0(arg0) {}

  template<typename T>
  Index eval_impl(const T& values) const { return m_arg0.eval_impl(values) - 1; }
protected:
  Arg0 m_arg0;
};

Однако использовать это в коде продукта было бы очень плохой идеей, которая может привести к путанице, возможным ошибкам, а также дополнительным немотивированным затратам времени выполнения для любой индексации. Когда вы пишете код на C ++, вы можете придерживаться практики индексации, основанной на нулях. Возможно, вы могли бы рассмотреть возможность использования символьной индексации при написании тестов для ваших формул, но с использованием целочисленной индексации на основе нуля для кода вашего продукта.

2 голосов
/ 12 мая 2019

Ответ "не совсем".

Конечно, как подсказывает @ πάνταῥεῖ, вы можете написать оболочку или наследовать от Eigen-типов и соответственно переписать операторы индексации.В качестве альтернативы вы можете реализовать пользовательский тип Index, который при преобразовании в Eigen::Index вычтет 1.

Но оба подхода подвержены ошибкам и, скорее всего, скорее увеличат путаницу, особенно если вы пропустите какой-либо соответствующийчастей.Кроме того, это очень запутает любого программиста C ++, смотрящего на ваш код, поскольку индексирование на основе 0 является наиболее естественным способом в C / C ++ (и во многих языках, синтаксис которых является производным от них, таких как Java, C #, ...)

Наконец, (как это и предлагает @dfri), если вы программируете на C ++, привыкните к индексации на основе 0, это избавит вас от многих проблем в долгосрочной перспективе.

...