Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在不指定维数的情况下声明具有本征值的张量?_C++_Eigen_Tensor - Fatal编程技术网

C++ 如何在不指定维数的情况下声明具有本征值的张量?

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是非类型模板参数,因此它必须是编译时已知的值。这意味着

我有一个函数,它以一个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
创建一个helper
tensor\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
等。