簡體   English   中英

如何在不指定維度的情況下使用 Eigen 聲明張量?

[英]How to declare a tensor with Eigen without specifying the dimension?

我有一個 function 將 n 維張量作為輸入,我必須存儲這個張量以便以后重用。 但是,我事先不知道我的張量的維度。 我想這樣做:

//in class.h
Eigen::Tensor<double, N> mytensor;
//in class.cpp 
mytensor = input; 

有沒有辦法做到這一點?

由於參數N是非類型模板參數,因此它必須是編譯時已知的值。 這意味着您不能真正將具有未指定NEigen::Tensor存儲在變量中,因為每個具有不同大小的實例化都是不同的類型。

您可以使用諸如std::variantstd::any之類的容器來解決此問題。 它們可以分別存儲來自封閉類型集或任何類型的類型的 object。 例如,您可以使用std::any創建一個助手tensor_holder class,如下所示:

template <typename T>
class tensor_holder
{
private:
    std::any _held;
    size_t _size;
public:
    template <int N>
    constexpr tensor_holder(Eigen::Tensor<T, N> tensor) :
        _held{std::move(tensor)},
        _size{N}
    {
    }
    constexpr tensor_holder(const tensor_holder&) = default;
    constexpr tensor_holder(tensor_holder&&) = default;
    template <size_t N>
    Eigen::Tensor<T, N>& get()
    {
        return std::any_cast<Eigen::Tensor<T, N>&>(_held);
    }
    template <size_t N>
    const Eigen::Tensor<T, N>& get() const
    {
        return std::any_cast<Eigen::Tensor<T, N>&>(_held);
    }
    constexpr int size() const noexcept
    {
        return _size;
    }
};

它將任意大小的Eigen::Tensor存儲在std::any中。 如果提供的大小與實際張量大小不匹配,則成員 function get throws std::bad_any_cast (請注意,作為編譯時間值的大小限制不會 go 離開)。

假設您有一小組可能的張量大小,您可以在 function 中運行不同的分支,如下所示:

void use_tensor(const tensor_holder<double>& in)
{
    static tensor_holder held = in; // it can be stored for later    

    if (held.size() == 4)
    {
        auto& tensor = held.get<4>();
        tensor(0, 1, 2, 3) = 115.5;
    }
    else if (held.size() == 3)
    {
        // some other logic
    }
}

在這種情況下,您也可以使用switch而不是if 僅當您必須支持的不同張量大小的數量很少時,此解決方案才實用。 我不知道你打算如何使用你的張量,所以我很難說這個解決方案是否足夠。

由於 class tensor_holder的轉換構造函數,您可以通過簡單地提供任意大小的Eigen::Tensor來調用 function:

use_tensor(Eigen::Tensor<double, 3>{});

神螺栓

暫無
暫無

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

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