如何将 n-dim 本征张量传递给函数?
How to pass an n-dim Eigen tensor to a function?
我想制作一个损失函数,可以将 2 个任意维度的张量作为参数,但张量 1 (t1) 和张量 (t2) 的维度必须匹配。下面是我尝试使用的模板,可以将张量传递给函数。我在想 T 将是一种类型,而 N 将对可能的索引数量进行建模,而无需为无限可能的张量维度显式编写类型。
loss.h
#include <iostream>
namespace Loss {
template<class T, std::size_t N>
void loss(Eigen::Tensor<T, N, 0>& predicted, Eigen::Tensor<T, N, 0>& actual) {
std::cout << "Loss::loss() not implemented" << std::endl;
};
};
main.cpp
#include "loss.h"
int main() {
Eigen::Tensor<double, 3> t1(2, 3, 4);
Eigen::Tensor<double, 3> t2(2, 3, 4);
t1.setZero();
t2.setZero();
Loss::loss(t1, t2);
return 0;
}
我在从我的编辑器编译之前得到的类型错误:
no instance of function template "Loss::loss" matches the argument list -- argument types are: (Eigen::Tensor<double, 3, 0, Eigen::DenseIndex>, Eigen::Tensor<double, 3, 0, Eigen::DenseIndex>
这是我编译(不成功)后得到的消息:
note: candidate template ignored: substitution failure [with T = double]: deduced non-type template argument does not have the same type as the corresponding template parameter ('int' vs 'std::size_t' (aka 'unsigned long'))
void loss(Eigen::Tensor<T, N, 0>& predicted, Eigen::Tensor<T, N, 0>& actual) {
^
1 error generated.
错误消息指出非类型模板参数的类型是size_t
,但在t1
和t2
的声明中该参数的值是3 ,其类型为 int
。这种不匹配导致模板参数推导失败。
您可以通过将非类型模板参数的类型更改为 int
来解决此问题
template<class T, int N>
void loss( // ...
或者直接推导
template<class T, auto N>
void loss( // ...
数字文字是有符号整数,并且您已将模板的数字类型指定为 size_t
,它是无符号的。所以类型不匹配。在您的主程序中尝试 Eigen::Tensor<double, 3u> …
以使用无符号文字。
我想制作一个损失函数,可以将 2 个任意维度的张量作为参数,但张量 1 (t1) 和张量 (t2) 的维度必须匹配。下面是我尝试使用的模板,可以将张量传递给函数。我在想 T 将是一种类型,而 N 将对可能的索引数量进行建模,而无需为无限可能的张量维度显式编写类型。
loss.h
#include <iostream>
namespace Loss {
template<class T, std::size_t N>
void loss(Eigen::Tensor<T, N, 0>& predicted, Eigen::Tensor<T, N, 0>& actual) {
std::cout << "Loss::loss() not implemented" << std::endl;
};
};
main.cpp
#include "loss.h"
int main() {
Eigen::Tensor<double, 3> t1(2, 3, 4);
Eigen::Tensor<double, 3> t2(2, 3, 4);
t1.setZero();
t2.setZero();
Loss::loss(t1, t2);
return 0;
}
我在从我的编辑器编译之前得到的类型错误:
no instance of function template "Loss::loss" matches the argument list -- argument types are: (Eigen::Tensor<double, 3, 0, Eigen::DenseIndex>, Eigen::Tensor<double, 3, 0, Eigen::DenseIndex>
这是我编译(不成功)后得到的消息:
note: candidate template ignored: substitution failure [with T = double]: deduced non-type template argument does not have the same type as the corresponding template parameter ('int' vs 'std::size_t' (aka 'unsigned long')) void loss(Eigen::Tensor<T, N, 0>& predicted, Eigen::Tensor<T, N, 0>& actual) { ^ 1 error generated.
错误消息指出非类型模板参数的类型是size_t
,但在t1
和t2
的声明中该参数的值是3 ,其类型为 int
。这种不匹配导致模板参数推导失败。
您可以通过将非类型模板参数的类型更改为 int
template<class T, int N>
void loss( // ...
或者直接推导
template<class T, auto N>
void loss( // ...
数字文字是有符号整数,并且您已将模板的数字类型指定为 size_t
,它是无符号的。所以类型不匹配。在您的主程序中尝试 Eigen::Tensor<double, 3u> …
以使用无符号文字。