我正在使用Eigen在我的代码中进行一些线性代数计算。但是,所有数学公式都基于索引从1开始的事实。因此,每次我想在代码中实现它们时,都必须检查代码中的索引是否与它们一致。我想知道是否可以告诉Eigen从1而不是0开始索引。
答案 0 :(得分:2)
答案是“不是真的”。
当然,正如@πάνταῥεῖ所建议的那样,您可以编写包装器或从Eigen类型继承,并相应地覆盖索引运算符。另外,您可以实现自定义Index
类型,将其转换为Eigen::Index
时将减去1。
但是这两种方法都容易出错,并且可能会增加混乱,特别是如果您错过了一些相关的部分。同时,这也会使任何C ++程序员看您的代码感到非常困惑,因为基于0的索引是C / C ++(以及许多从其派生语法的语言,例如Java,C#等)中最自然的方式。
最后,(如@dfri所建议),如果您使用C ++编写的代码习惯了从0开始的索引编制,从长远来看,这将为您省去很多麻烦。
答案 1 :(得分:2)
Eigen中的索引操作除了允许使用整数索引外,还允许使用符号索引进行索引。您应该能够实现自symbolic index派生的自定义Eigen::symbolic::BaseExpr
,可以将其用作基于1的索引API,其中其eval_impl
方法仅将1
减去其arg。例如:
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 ++进行编码时,您可能想要坚持其从零开始的索引实践。也许在为公式编写测试时可以考虑使用符号索引,但是对产品代码使用基于零的整数索引。