C++ 如何在不指定维数的情况下声明具有本征值的张量?
我有一个函数,它以一个n维的张量作为输入,我必须存储这个张量以便以后重用。 然而,我事先不知道张量的维数。 我想这样做:C++ 如何在不指定维数的情况下声明具有本征值的张量?,c++,eigen,tensor,C++,Eigen,Tensor,我有一个函数,它以一个n维的张量作为输入,我必须存储这个张量以便以后重用。 然而,我事先不知道张量的维数。 我想这样做: //in class.h Eigen::Tensor<double, N> mytensor; //in class.cpp mytensor = input; //在class.h中 本征::张量mytensor; //在class.cpp中 mytensor=输入; 有办法做到这一点吗?由于参数N是非类型模板参数,因此它必须是编译时已知的值。这意味着
//in class.h
Eigen::Tensor<double, N> mytensor;
//in class.cpp
mytensor = input;
//在class.h中
本征::张量mytensor;
//在class.cpp中
mytensor=输入;
有办法做到这一点吗?由于参数
N
是非类型模板参数,因此它必须是编译时已知的值。这意味着您无法在变量中存储未指定的N
的Eigen::Tensor
,因为每个大小不同的实例化都是不同的类型
您可以使用诸如std::variant
和std::any
之类的容器来解决这个问题。它们使得分别从封闭的类型集或任何类型中存储类型的对象成为可能。例如,您可以使用std::any
创建一个helpertensor\u holder
类,如下所示:
模板
类张量
{
私人:
std::任何持有的;
大小(t)大小;;
公众:
模板
恒量张量(本征::张量张量):
_保持{std::move(张量)},
_大小{N}
{
}
constexpr-tensor\u-holder(const-tensor\u-holder&)=默认值;
constexpr-tensor\u-holder(tensor\u-holder&&)=默认值;
模板
本征::张量&get()
{
返回标准::任何投法(持有);
}
模板
常量本征::张量和get()常量
{
返回标准::任何投法(持有);
}
constexpr int size()const noexcept
{
返回大小;
}
};
它在std::any
中存储任意大小的Eigen::Tensor
。如果提供的大小不匹配,成员函数get
将抛出std::bad\u any\u cast
真正的张量大小(请注意,大小作为编译时值的限制并没有消失)
假设您有一小组可能的张量大小,您可以在函数中运行不同的分支,如下所示:
void使用张量(常量张量)
{
静态张量=in;//可以存储以备以后使用
如果(保持.size()==4)
{
auto&tensor=hold.get();
张量(0,1,2,3)=115.5;
}
else if(hold.size()==3)
{
//其他一些逻辑
}
}
在这种情况下,您也可以使用开关来代替if
。只有当必须支持的不同张量大小的数量很少时,此解决方案才是实用的。我不知道你们打算如何使用张量,所以我很难说这个解是否足够
由于类tensor\u holder
的转换构造函数,您只需为函数提供一个任意大小的Eigen::tensor
即可调用该函数:
使用_张量(本征::张量{});
()恐怕你用错工具了<代码>N
只能在编译时指定。比我更了解Eigen的人可能会提供一个替代方案。嗯,我认为这也不可能,但对于N
,必须是constexpr
,因此编译器在编译时就已经知道了。。。对于数量有限的不同N
可以使用std::variant
等。