6

ハミングエラー修正コードを実装しようとしています。これを行うには、bool Vector (データ) を取得し、bool Matrix (ハミング生成行列) で乗算し、XOR 演算を実行する必要があります (OR のように見えるものの代わりに)。 Eigen のデフォルトの bool 動作)。私がやっていることの例は、この簡単なチュートリアルにあります: 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 することです。OR ではなく XOR が必要なので、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;
}
4

2 に答える 2

5

ブロードキャストと部分還元を使用して、matrix_vector 積を模倣できます。

struct logical_xor { bool operator(bool a, bool b) { return a != b; }
result = (gm.array().colwise() * dm.transpose().array()).colwise().redux(logical_xor());

変数を配列として宣言し、dm が既に列配列である場合、これは次のように簡略化されます。

result = (gm.colwise() * dm).colwise().redux(logical_xor());
于 2013-09-17T08:58:20.897 に答える