簡體   English   中英

我可以連接 Eigen::Vectors 的 std::tuple 嗎?

[英]Can I concatenate a std::tuple of Eigen::Vectors?

例如,如果我有一個靜態分配的Eigen::Vector (來自流行的Eigen庫)的std::tuple

std::tuple<Eigen::Vector2f, Eigen::Vector3f, Eigen::Vector2f>

有沒有辦法可以將它變成連接三個向量的單個Eigen::Vector7f (即Eigen::Matrix<float, 7, 1> )? 感覺我應該能夠在編譯時做到這一點,因為一切的大小和類型都是已知的。

你可以寫:

template<int R1, int R2, int R3>
auto foo(std::tuple< 
    Eigen::Matrix<float,R1,1>, 
    Eigen::Matrix<float,R2,1>, 
    Eigen::Matrix<float,R3,1> > t)
{
    Eigen::Matrix<float,R1+R2+R3,1> res;
    res.template block<R1,1>(0,0) = std::get<0>(t);
    res.template block<R2,1>(R1,0) = std::get<1>(t);
    res.template block<R3,1>(R1+R2,0) = std::get<2>(t);
    return res;
}

int main() {
    Eigen::Vector2f v1;
    v1 << 1,2;
    Eigen::Vector3f v2;
    v2 << 3,4,5;
    std::cout << foo(std::make_tuple(v1,v2,v1)) << std::endl;

作為 output:

1,2,3,4,5,1,2

現場演示


下面是更通用的版本,將多個向量作為元組組件:

template<class RES, int ... R, size_t ... Indices>
void concatenateHelper(RES& res, 
    const std::tuple< Eigen::Matrix<float,R,1>... >& t,
    std::index_sequence<Indices...>)
{
    int idx = 0;
    int fakeArray [] = {(res.template block<R,1>(idx,0) = std::get<Indices>(t),idx += R,0)...};
    static_cast<void>(fakeArray);
}

template<int ... R>
auto concatenate(const std::tuple< Eigen::Matrix<float,R,1> ... >& t) 
{
    Eigen::Matrix<float, (R + ...),1> res;
    concatenateHelper(res,t,std::make_index_sequence<sizeof...(R)>{});
    return res;
}

演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM