gpt4 book ai didi

c++ - 如何用 Z_2 中的系数求解稀疏线性系统?

转载 作者:太空宇宙 更新时间:2023-11-04 13:14:35 25 4
gpt4 key购买 nike

我想使用 Eigen 求解系数在 Z_2 中的大型稀疏线性方程组。首先我们尝试了 Boolean 类型,它不起作用,因为 Boolean 中的 1+1=1 但我期望 1+1=0。因此,解决方案可能是新的自定义标量类型。但它究竟是如何工作的呢?也欢迎提供其他软件包或软件的一些建议。

最佳答案

因为基本类型的运算符不能被重载。您需要自定义标量类型。这是告诉您如何执行此操作的基本文档。

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

基本上您需要做 3 件事。

  1. make sure the common operator (+,-,*,/,etc.) are supported by the type T
  2. add a specialization of struct Eigen::NumTraits
  3. define the math functions that makes sense for your type. This includes standard ones like sqrt, pow, sin, tan, conj, real, imag, etc, as well as abs2 which is Eigen specific. (see the file Eigen/src/Core/MathFunctions.h)

实际上,您可以只定义方程求解所需的那些运算符和数学函数。

上面的链接提供了 adtl::adouple 类型的简单示例。代码非常短,因为大部分操作都已经明确定义。在 Eigen 源目录 unsupported/ 中,还有另一个第 3 方类型 mpfr::mpreal 支持。您可以从此链接开始。

https://eigen.tuxfamily.org/dox/unsupported/group__MPRealSupport__Module.html

在 Eigen 源目录中,这些文件与 mpfr::mpreal 支持相关。它们可能会有用。

./unsupported/Eigen/MPRealSupport./unsupported/test/mpreal/mpreal.h./unsupported/test/mpreal_support.cpp


这是 Z_2 中支持矩阵乘法的最小工作示例:

#include <iostream>
#include <Eigen/Eigen>

namespace Z2 {

struct Scalar {
Scalar() :
data(0) {
}
Scalar(bool x) :
data(x) {
}
bool data;

inline Scalar operator+=(const Scalar& a) {
return data ^= a.data;
}
};

inline Scalar abs(const Scalar& a) {
return a;
}

inline Scalar operator+(const Scalar& a, const Scalar& b) {
return a.data ^ b.data;
}

inline Scalar operator*(const Scalar& a, const Scalar& b) {
return a.data & b.data;
}

template<class E, class CT>
std::basic_ostream<E, CT> &operator <<(std::basic_ostream<E, CT> &os,
const Z2::Scalar &m) {
return os << m.data;
}

}

namespace Eigen {
// follow all other traits of bool
template<> struct NumTraits<Z2::Scalar> : NumTraits<bool> {
typedef Z2::Scalar Real;
typedef typename internal::conditional<sizeof(Z2::Scalar) <= 2, float, double>::type NonInteger;
typedef Z2::Scalar Nested;
};
}

int main(void) {
using namespace Eigen;
Matrix<Z2::Scalar, Dynamic, Dynamic> x(2, 2), y(2, 2), i(2, 2), j(2, 2);
x.row(0) << 1, 1;
y.col(0) << 1, 1;
i.setIdentity();
j = i.array() + 1;
std::cout << "x=\n" << x << std::endl;
std::cout << "y=\n" << y << std::endl;
std::cout << "i=\n" << i << std::endl;
std::cout << "j=\n" << j << std::endl;
std::cout << "x+y=\n" << x + y << std::endl;
std::cout << "x.*y=\n" << x.array() * y.array() << std::endl;
std::cout << "y*j=\n" << y * j << std::endl;
std::cout << "abs(x)=\n" << x.array().abs() << std::endl;
return 0;
}

结果:

x=
1 1
0 0
y=
1 0
1 0
i=
1 0
0 1
j=
0 1
1 0
x+y=
0 1
1 0
x.*y=
1 0
0 0
y*j=
0 1
0 1
abs(x)=
1 1
0 0

关于c++ - 如何用 Z_2 中的系数求解稀疏线性系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37970918/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com