我正在尝试实现汉明纠错码,为此我需要获取一个布尔向量(数据)并将其与一个布尔矩阵(汉明生成矩阵)相乘,执行 XOR 运算(而不是看起来像 OR Eigen 的默认布尔行为)。在这个简单的教程中可以找到我正在做的一个例子:http: //michael.dipperstein.com/hamming/
我不一定要使用 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 执行此操作的最佳方法是什么?
如果这没有意义,很高兴尝试和详细说明。
顺便说一句,不确定这是否重要,但我正在使用 G++ 开发 MacBook Air。今天刚刚下载了 Eigen,所以它的概率是最新的(eigen3)
谢谢你,
基思
更新:鉴于下面接受的解决方案,我想重新发布正确的代码作为人们的参考:
#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;
}