Eigen: как преобразовать результат «больше чем» (на ArrayXf) в вектор Eigen - PullRequest
0 голосов
/ 22 декабря 2018

Рассмотрим следующий код:

Eigen::VectorXf classify()
{
   Eigen::VectorXf probability(4);
   probability << 0.9, 0.8, -0.1, 0.2;

   auto y_pred = probability.array() > 0.8; //what is the type of y_pred?
   //y_pred looks like [1 0 0 0]

   // how to return y_pred as a VectorXf? 
   // I'm trying this, but it is not working:
   return static_cast<Eigen::VectorXf>(y_pred); //doesn't work
}

int main() 
{
   classify();
}

2 вопроса:

  • (для моего понимания) Какой тип y_pred?Я думал, что это ArrayXf, но, похоже, дело не в
  • (вопрос, о котором пойдет этот пост), как я могу преобразовать y_pred в собственный вектор (VectorXf или что-то еще)?

Ответы [ 3 ]

0 голосов
/ 22 декабря 2018

Если вы посмотрите на Eigen документацию , вы заметите, что Eigen::VectorXf на самом деле typedef для Eigen::Matrix<float, Eigen::Dynamic, 1>.

Тип y_pred

Класс Eigen::Matrix является производным от шаблонного класса Eigen::MatrixBase, из которого происходит функция-член array().Этот метод возвращает объект-оболочку, который в принципе можно рассматривать как Eigen::Array.Применение оператора сравнения к результату array() дает Eigen::Array из bool.

Преобразование в вектороподобный тип

В документации есть раздел посвященный использованию Eigen::Array класса.Один из подразделов, а именно Преобразование между выражениями массива и матрицы , представляет особый интерес в контексте вашего вопроса.Там можно прочитать, что Eigen::Array можно преобразовать в Eigen::Matrix с помощью метода matrix().

Используя приведенные выше наблюдения, вы сможете преобразовать y_pred в какой-то вектор, возвращая y_pred.matrix() вместо static_cast<Eigen::VectorXf>(y_pred).Тип возвращаемого значения, вероятно, будет примерно таким: Eigen::Matrix<bool, Eigen::Dynamic, 1>.

. Из-за того, что матрицы bool менее распространены в операциях линейной алгебры, с ними не связано typedef.

0 голосов
/ 23 декабря 2018

y_pred является абстрактным выражением.Его тип похож (упрощен для удобства чтения):

CWiseBinaryOp<greater<float>,ArrayWrapper<VectorXf>,CwiseNullaryOp<Constant<float>,ArrayXf>>

Он наследует ArrayBase, а его тип Scalar равен bool.

Если вы хотите VectorXf,затем приведите bools к плавающим значениям:

VectorXf foo = y_pred.cast<float>();

Приведение от array к matrix подразумевается в этом случае.

0 голосов
/ 22 декабря 2018

Нет, progress будет работать с правым выражением, поэтому auto a = 3> 2 вернет bool: 1 или 0. (если правое выражение истинно, значение left равно 1), поэтому тип y_pred - bool.

...