Лямбда-функция поэлементно в собственном коде

Это комбинация следующих предыдущих вопросов: Применить функцию ко всем элементам матрицы Eigen и Установите коэффициенты Eigen::Matrix в соответствии с произвольное распространение. В основном я пытаюсь создать матрицу Eigen с ее коэффициентами, выбранными из распределения Гаусса.

Вот мой код для этого (метод статического класса), который возвращает довольно загадочное сообщение об ошибке:

matrix_eig EigenUtil::GaussianNoise(size_t rows, size_t cols,
                                    float mean, float std) {
  matrix_eig m(rows, cols);
  std::mt19937 rng;
  std::normal_distribution<float> nd(mean, std);
  auto sampler = [&]() { return nd(rng); };
  return matrix_eig::Zero(rows, cols).unaryExpr(sampler);
}

Что возвращает ошибку: error:

no type named 'type' in 'std::__1::result_of<(lambda at eigen_util.cpp:101:18) (const float &)>'
  typedef typename std::result_of<T>::type type1;

person tangy    schedule 26.06.2018    source источник
comment
Это не похоже на унарную функцию, это похоже на нулевую. std::result_of не определено, если вы не можете вызвать данную функцию с заданными аргументами. Попробуйте [&](float /*unused*/) возможно?   -  person o11c    schedule 27.06.2018


Ответы (1)


Как заметил o11c, это действительно нулевое выражение, и почти такой же пример есть в 1DenseBase.html#a997ef3960458fb5dedb8f7f78b068a9b" rel="nofollow noreferrer ">документ. Скопировал для удобства:

#include <Eigen/Core>
#include <iostream>
#include <random>
using namespace Eigen;
int main() {
  std::default_random_engine generator;
  std::poisson_distribution<int> distribution(4.1);
  auto poisson = [&] () {return distribution(generator);};
  RowVectorXi v = RowVectorXi::NullaryExpr(10, poisson );
  std::cout << v << "\n";
}
person ggael    schedule 26.06.2018
comment
Хотя это работает правильно на моем Mac, в Ubuntu 16.04 выдается ошибка с g++ -std=c++11. /usr/include/eigen3/Eigen/src/Core/CoreEvaluators.h:348:27: ошибка: не соответствует вызову '(const main()::‹lambda()›) (Eigen::Index&)' return m_functor (индекс); ^ abc.cpp:8:23: примечание: кандидат: main()::‹lambda()› auto poisson = [&] () {возвратное распределение (генератор);}; ^ abc.cpp:8:23: примечание: кандидат ожидает 0 аргументов, предоставлен 1 - person tangy; 05.07.2018
comment
Вам нужен Eigen 3.3.x. - person ggael; 06.07.2018