eigen:创建 Vector-like Replicate(使用一个索引访问,LinearAccessBit)

eigen: create Vector-like Replicate (access with one index, LinearAccessBit)

我想创建一个可以像向量一样访问的 Eigen::Replicate 对象,即使用单个索引。我得到它与固定大小 replicate<Index,Index>() 一起工作,我在现实中不能使用它,非一因子不是编译时常量。它在手动创建 Replicate 对象时也有效,但我觉得我只是忽略了使用 replicate 函数实现此目的的明显方法:

#include <Eigen/Dense>
#include <iostream>

using namespace Eigen;

int main(){
    Vector3i v (3);
    v << 0,1,2;

    constexpr int nReplications {2};

    auto replDynamic { v.replicate(nReplications, 1) };
    /* with a dynamic replication, two indexes are required to access a coeff */
    std::cout << "5th entry: " << replDynamic(4,0) << '\n';
    
    auto replFixed { v.replicate<nReplications, 1>() };
    /* I want to use only one index, but I require the number of replications
     * in one dimension to be dynamic */
    std::cout << "5th entry: " << replFixed(4) << '\n';
    
    /* don't know how to access the VectorwiseOp variant */
//  auto replVector { v.replicate(nReplications) };
//  std::cout << "5th entry: " << replVector(4) << '\n';
    
    /* this function doesn't exist */
//  auto replDefined { v.replicate<Dynamic,1>(nReplications, 1) };
//  std::cout << "5th entry: " << replDefined(4) << '\n';
    
    /* I'd rather not define it manually (it's not the intended way), but it works */
    Replicate<Vector3i,Dynamic,1> replManual { v, nReplications, 1 };
    std::cout << "5th entry: " << replManual(4) << '\n';

    return 0;
}

source code在第134行显示VectorwiseOp<...>::replicate(Index factor),这听起来是我需要的,但我似乎无法访问它。 并且 replicate<Index,Index>(Index,Index) 等函数不存在。

假设我明白你在问什么,因为 Vector3i 是一列 Eigen::Matrix,你可以从 Vector3i 中得到一个 VectorwiseOp<...> 表达式模板(比如) 通过使用 colwise() 函数,然后用那个函数调用一个参数 replicate

#include <Eigen/Dense>
#include <iostream>

using namespace Eigen;

int main() {

    Vector3i v(3);
    v << 0, 1, 2;

    auto foo = v.colwise().replicate(2);

    std::cout << "5th entry: " << foo(4) << '\n';

    return 0;
}

请注意,尽管在表达式模板上使用类型推导,或在 Eigen 文档中称为“伪表达式”,通常是一个坏主意,即编写 Eigen::Matrix<int, 6, 1> foo = v.colwise().replicate(2) 更安全; Eigen 文档提到了问题 here.

通过在 replicate(...) 调用之后添加一个 .reshaped()ColsAtCompileTime 被设置为 1,因此,可以像访问向量一样访问结果对象:

#include <Eigen/Dense>
#include <iostream>

using namespace Eigen;

int main(){
    Vector3i v (3);
    v << 0,1,2;

    constexpr int nReplications {2};
    
    auto replReshaped { v.replicate(nReplications, 1).reshaped() };
    std::cout << "5th entry: " << replReshaped(4) << '\n';

    return 0;
}