Как изменить тензор в Eigen3? - PullRequest
1 голос
/ 11 июля 2019

Я получаю некоторый Eigen :: TensorMap из выходного вектора из сеанса тензорного потока в C ++.Я хочу выполнить некоторые операции с Eigen :: TensorMap (изменить и конкатовать и т. Д.).

Однако мои коды не могут быть скомпилированы из-за какой-то странной ошибки.Я попытался воспроизвести его в чистом коде Eigen3.

#include <unsupported/Eigen/CXX11/Tensor>
using Eigen::Tensor;
using Eigen::TensorMap;
using Eigen::TensorRef;
using std::vector;
int main() {
    int storage[128];
    TensorMap<Tensor<int, 4>> t_4d(storage, 2, 4, 2, 8);
    vector<TensorRef<Tensor<int,2>>> reshapedTensors;
    std::array<int, 2> shape{ 16,8 };
    auto re_op = t_4d.reshape(shape);
    reshapedTensors.push_back(re_op);
    return 0;
}

В соответствии с Eigen Doc , возвращаемый тип функции изменения формы - это собственная операция, она будет лениво вычисляться.TensorRef - это оболочка всех тензорных операций.

Этот фрагмент кода будет жаловаться на то, что:

Код серьезности Описание Ошибка состояния подавления строки файла проекта C2679 бинарный '=': не найден оператор, который принимает правый операнд типа 'const std:: array '(или нет приемлемого преобразования) testEigen D: \ Programming \ cpp library \ eigen-eigen-323c052e1731 \ unsupported \ Eigen \ CXX11 \ src \ Tensor \ TensorRef.h 49

1 Ответ

1 голос
/ 15 июля 2019

Вы не можете смешивать разные IndexType для операций Tensor (это неявный 4-й параметр шаблона Tensor).Это также означает, что тип std::array должен соответствовать IndexType.По умолчанию Eigen::Tensor использует Eigen::DenseIndex, что совпадает с Eigen::Index.Вы можете либо написать это вместо Eigen::Tensor<int,4> (аналогично Tensor<int,2>)

Eigen::Tensor<int, 4, 0, int>

, либо заменить std::array<int, 2> на std::array<Eigen::Index, 2>.Конечно, выполнение typedef s для обоих сохранит некоторую печать и упростит рефакторинг, если вам когда-нибудь понадобится это.

...