问题描述
我正在尝试使用 Eigen 来求解 GF2 上的方程(即模 2)。
不幸的是,我得到了一些 5x5 矩阵的错误结果(较小的矩阵似乎也有效)。
#include <assert.h> // assert
#include <stdexcept> // std::invalid_argument
#include <Eigen/Dense>
#include <Eigen/LU>
#include <iostream>
//////////
// GF 2 //
//////////
/**
* Enable solving modulo 2,inspired by
* https://stackoverflow.com/questions/59747377/custom-scalar-type-in-eigen
**/
struct GF2 {
public:
bool value;
GF2() : value(0) {};
GF2(bool v) : value(v) {};
GF2 operator-() const { return *this; };
friend std::ostream &operator<<(std::ostream &out,const GF2 &val) {
out << val.value << " ";
return out;
}
GF2 &operator+=(const GF2 &rhs) {
this->value ^= rhs.value;
return *this;
}
GF2 &operator-=(const GF2 &rhs) {
return *this += rhs;
}
GF2 &operator*=(const GF2 &rhs) {
this->value &= rhs.value;
return *this;
}
GF2 &operator/=(const GF2 &rhs) {
if (rhs.value == 0) {
throw std::invalid_argument("Division by zero");
}
return *this;
}
GF2 operator/(int rhs) {
if (rhs == 0) {
throw std::invalid_argument("Division by zero");
}
return GF2(this->value);
}
operator bool() const {
return value;
}
};
bool isfinite(const GF2 &) { return true; }
namespace Eigen {
template <>
struct NumTraits<GF2> : NumTraits<bool> {
// https://eigen.tuxfamily.org/dox/structEigen_1_1NumTraits.html
enum {
IsComplex = 0,IsInteger = 0,IsSigned = 0,RequireInitialization = 1,Readcost = 1,Addcost = 3,MulCost = 3
};
};
} // namespace Eigen
//////////////////////
// TYPE DEFinitioNS //
//////////////////////
// GF 2
typedef Eigen::Matrix<GF2,Eigen::Dynamic,Eigen::Dynamic> GF2Matrix;
/////////////////
// SOLVE MOD 2 //
/////////////////
GF2Matrix solve_mod_2_GF2(GF2Matrix A,GF2Matrix b) {
// https://eigen.tuxfamily.org/dox/group__TutorialLinearalgebra.html
// householderQr is faster but yields incorrect results in some cases
auto decomposition = A.fullPivLu();
std::cout << "LU:" << std::endl << decomposition.matrixLU() << std::endl << std::endl;
auto x = decomposition.solve(b);
return x;
}
//////////
// MAIN //
//////////
int main () {
int n = 5;
GF2Matrix A(n,n);
GF2Matrix b(n,1);
A << 1,1,1;
b << 1,0;
std::cout << "A:" << std::endl << A << std::endl;
std::cout << std::endl;
std::cout << "b:" << std::endl << b << std::endl;
std::cout << std::endl;
auto x = solve_mod_2_GF2(A,b);
std::cout << "x:" << std::endl << x << std::endl;
// solution is incorrect,even though Ax=b admits solution
// x = [0,1]
return 0;
}
我正在像这样运行我的代码(使用 eigen 3.4):
$ g++ -I./eigen -o my_solve.o -std=c++11 my_solve.cpp && ./my_solve.o
A:
1 0 0 0 1
0 1 0 0 0
1 0 1 1 0
0 0 0 1 1
1 0 0 1 1
b:
1
0
1
0
0
LU:
1 0 0 0 1
0 1 0 0 0
1 0 1 1 1
0 0 0 1 1
1 0 0 1 1
x:
1
0
0
1
1
任何想法如何解决这个问题?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)