Расстояние Хэмминга через Eigen и std::bitset

У меня есть Eigen::Matrix<bool,Dynamic,Dynamic> H (p,b) в результате эквивалентной операции Matlab H = (K*W)>0; (см. этот вопрос для более подробной информации).

Однако мне нужно вычислить расстояние Хэмминга между каждой строкой H и вектором v. Поскольку легко и быстро вычислить его между двумя std::bitset a и b через (a^b).count(), мне было интересно, можно ли реализовать H = (K*W)>0;, где H равно Eigen::Array<std::bitset,Dynamic,1>.

В качестве альтернативы чтение этого вопроса У меня есть ощущение, что я могу использовать redux() для Eigen::Matrix<bool,Dynamic,Dynamic> H (p,b), но я не могу понять, как определить функцию сокращения


person justHelloWorld    schedule 14.07.2016    source источник


Ответы (1)


Использование std::bitset может быть затруднено, так как вам нужно рассматривать std::bitset как настраиваемый скалярный тип и определять для него скалярные операции.

https://eigen.tuxfamily.org/dox/TopicCustomizingEigen.html#CustomScalarType

С другой стороны, расстояние Хэмминга легко, хотя .count() здесь может быть медленнее, чем std::bitset::count().

#include <iostream>
#include <Eigen/Eigen>
using namespace Eigen;

int main() {
  const int p = 5;
  const int b = 10;
  Eigen::Matrix<bool, Dynamic, Dynamic> H(p, b);
  Eigen::Matrix<bool, 1, Dynamic> V(b);
  H.setRandom();
  V.setRandom();

  std::cout << "H:\n" << H << std::endl;
  std::cout << "V:\n" << V << std::endl;
  std::cout << "distance(H, V):\n"
      << (H.array() != V.replicate(p, 1).array()).rowwise().count()
      << std::endl;
  return 0;
}
person kangshiyin    schedule 14.07.2016