Я пытаюсь реализовать коды исправления ошибок, и для этого мне нужно взять вектор bool (данные) и умножить его на bool Матрица (матрица генератора помех), выполняющая операции XOR (вместо того, что выглядит как OR по умолчанию по умолчанию BIG). Пример того, что я делаю, можно найти в этом простом учебнике: http://michael.dipperstein.com/hamming/умножение bool с эксклюзивным или не или (с помощью библиотеки собственных матриц)
Мне не обязательно использовать Eigen, поэтому, пожалуйста, не стесняйтесь предлагать что-то другое, кроме Eigen, если у вас есть решение.
Так, например, немного C++ кода, который компилирует, но не совсем работать правильный путь:
#include <Eigen/Dense>
#include <iostream>
using namespace std;
using namespace Eigen;
typedef Eigen::Matrix<bool, 4, 7> Matrix4by7Bool;
typedef Eigen::Matrix<bool, 1, 4> Vector4Bool;
int main()
{
Matrix4by7Bool gm;
gm << 0,1,1,1,0,0,0,
1,0,1,0,1,0,0,
1,1,0,0,0,1,0,
1,1,1,0,0,0,1;
Vector4Bool dm;
dm << 1,0,1,0;
cout << dm * gm;
}
в настоящее время приводит к: 1 1 1 1 0 1 0
но мне нужно: 1 0 1 1 0 1 0
Разница в том, что поведение по умолчанию заключается в умножении, а затем в OR каждое умножение. Поскольку мне нужен XOR вместо OR, интересно, какой лучший способ сделать это с Eigen?
С удовольствием попробуем разобраться, если это не имеет смысла.
BTW, не уверен, если это имеет значение, но я работаю над MacBook Air, используя G ++. Просто скачал Айген так его вероит новейший доступные (eigen3)
Спасибо,
Кита
UPDATE: Учитывая принятым решением ниже, я хотел перепечатывать правильный код в качестве ссылки для людей:
#include <Eigen/Dense>
#include <iostream>
using namespace std;
using namespace Eigen;
typedef Eigen::Array<bool, 4, 7> Array4by7Bool;
typedef Eigen::Array<bool, 4, 1> Array1by4Bool;
struct logical_xor {
bool operator() (bool a, bool b) const
{
return a != b;
}
};
int main()
{
Array4by7Bool gm;
gm << 0,1,1,1,0,0,0,
1,0,1,0,1,0,0,
1,1,0,0,0,1,0,
1,1,1,0,0,0,1;
Array1by4Bool dm;
dm << 1,0,1,0;
cout << "result: " << (gm.colwise() * dm).colwise().redux(logical_xor()) << endl;
}
Возможно, вы сможете написать свою собственную функцию, используя цикл 'for' и оператор XOR ^(). –