如何将 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,但在t1t2的声明中该参数的值是3 ,其类型为 int。这种不匹配导致模板参数推导失败。

您可以通过将非类型模板参数的类型更改为 int

来解决此问题
template<class T, int N>
void loss( // ...

或者直接推导

template<class T, auto N>
void loss( // ...

数字文字是有符号整数,并且您已将模板的数字类型指定为 size_t,它是无符号的。所以类型不匹配。在您的主程序中尝试 Eigen::Tensor<double, 3u> … 以使用无符号文字。