是否可以从 Eigen 中的 1 开始索引矩阵?
Is it possible to start indexing of matrices from 1 in Eigen?
我正在使用 Eigen 在我的代码中进行一些线性代数计算。然而,所有的数学公式都是基于索引从1开始的事实。所以,每次我想在代码中实现它们时,我都必须检查我在代码中的索引是否与它们一致。我想知道是否可以告诉 Eigen 从 1 而不是 0 开始索引。
答案是"not really"。
当然,正如@πìνταῥεῖ 所建议的,您可以编写包装器或从 Eigen 类型继承并相应地覆盖索引运算符。或者,您可以实现自定义 Index
类型,当转换为 Eigen::Index
时,将减去 1。
但这两种方法都是 error-prone 并且可能会增加混淆,尤其是当您遗漏了一些相关部分时。此外,它会极大地混淆任何查看您的代码的 C++ 程序员,因为基于 0 的索引是 C/C++ 中最自然的方式(以及许多语法源自它们的语言,如 Java、C# , ...)
最后,(正如@dfri 所建议的那样)如果您使用 C++ 编写代码习惯于从 0 开始的索引,这将为您在漫长的 运行.
中省去很多麻烦
Eigen 中的索引操作除了使用整数进行索引外,还允许使用符号索引进行索引。您应该能够实现自己的自定义 symbolic index, derived from 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;
};
然而,在产品代码中使用它很可能是一个非常糟糕的主意,可能会导致混淆、可能的错误以及任何索引的额外 non-motivated run-time 开销.当您使用 C++ 编码时,您可能希望坚持其 zero-based 索引实践。也许您可以考虑在为您的公式编写测试时使用符号索引,但为您的产品代码使用整数 zero-based 索引。
我正在使用 Eigen 在我的代码中进行一些线性代数计算。然而,所有的数学公式都是基于索引从1开始的事实。所以,每次我想在代码中实现它们时,我都必须检查我在代码中的索引是否与它们一致。我想知道是否可以告诉 Eigen 从 1 而不是 0 开始索引。
答案是"not really"。
当然,正如@πìνταῥεῖ 所建议的,您可以编写包装器或从 Eigen 类型继承并相应地覆盖索引运算符。或者,您可以实现自定义 Index
类型,当转换为 Eigen::Index
时,将减去 1。
但这两种方法都是 error-prone 并且可能会增加混淆,尤其是当您遗漏了一些相关部分时。此外,它会极大地混淆任何查看您的代码的 C++ 程序员,因为基于 0 的索引是 C/C++ 中最自然的方式(以及许多语法源自它们的语言,如 Java、C# , ...)
最后,(正如@dfri 所建议的那样)如果您使用 C++ 编写代码习惯于从 0 开始的索引,这将为您在漫长的 运行.
中省去很多麻烦Eigen 中的索引操作除了使用整数进行索引外,还允许使用符号索引进行索引。您应该能够实现自己的自定义 symbolic index, derived from 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;
};
然而,在产品代码中使用它很可能是一个非常糟糕的主意,可能会导致混淆、可能的错误以及任何索引的额外 non-motivated run-time 开销.当您使用 C++ 编码时,您可能希望坚持其 zero-based 索引实践。也许您可以考虑在为您的公式编写测试时使用符号索引,但为您的产品代码使用整数 zero-based 索引。