是否可以从特征中的 1 开始索引矩阵?



我正在使用Eigen在我的代码中进行一些线性代数计算。但是,所有数学公式都基于索引从 1 开始的事实。因此,每次我想在代码中实现它们时,我都必须检查我在代码中的索引是否与它们一致。我想知道是否有可能告诉 Eigen 从 1 而不是 0 开始索引。

特征中的索引操作除了允许使用整数进行索引外,还允许使用符号索引进行索引。您应该能够实现自己的自定义符号索引,该索引派生自Eigen::symbolic::BaseExpr,可以用作基于 1 的索引 API,其中其eval_impl方法只是从其参数中减去1。例如:

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++中编码时,您可能希望坚持其从零开始的索引实践。也许在为公式编写测试时可以考虑符号索引,但对产品代码使用基于整数零的索引。

答案是"不是真的"。

当然,正如@πάνταῥεῖ建议的那样,您可以编写包装器或从 Eigen 类型继承,并相应地覆盖索引运算符。或者,您可以实现一个自定义Index类型,当转换为Eigen::Index时,将减去 1。

但是这两种方法都容易出错,并且可能会增加混乱,特别是如果您错过了一些相关部分。此外,它会使任何查看代码C++程序员感到非常困惑,因为基于 0 的索引是 C/C++ 中最自然的方式(以及许多语法源自它们的语言,如 Java、C#......

最后,(正如@dfri所建议的那样)如果你编码C++习惯于从0开始的索引,从长远来看,这将为你节省很多麻烦。

相关内容

  • 没有找到相关文章

最新更新