如何在 Eigen::Map class 的模板中使用变量作为参数

How to employ a variable as parameter inside template of the Eigen::Map class

我在 Eigen 中遇到了以下问题,使用 class 映射在向量中采用均匀间隔的一组元素。

void func (int A, int B)
{
    Eigen::Map<VectorXf,0,Eigen::InnerStride<B> > myMap(v.data() + B - 1, A);
}

问题出在模板“Eigen::InnerStride”的第三个参数中。编译器说“错误:'B' 不是常量表达式”。 我尝试修复如下:

constexpr int varToConst(int arg)
{
    return arg;
}

void func (int A, int B)
{
    Eigen::Map<VectorXf,0,Eigen::InnerStride<varToConst(B)> > myMap(v.data() + B - 1, A);
}

但我得到了同样的错误。 int B 变量由 main 传递,不幸的是,在 main 内部,它不能是 const。 预先感谢您的帮助。

您可以使用动态步幅,如下所示:

void func (int A, int B) {
    Eigen::Map<VectorXf,0,Eigen::InnerStride<>> myMap(v.data() + B - 1, A, Eigen::InnerStride<>(B));
}

如果这部分对性能很关键,并且可行 B 的数量很少(比如 - 也许唯一有效的值是 B=2B=3),那么您也可以模板 func() 关于 B 的值。然后你会在呼叫站点有类似 template <int B> func(int A)func<2>(/*A=*/10); 的东西。