Я хочу решить большие разреженные линейные уравнения с коэффициентами в Z_2, используя Eigen. Сначала мы попробовали булевский тип, который не работает, потому что 1 + 1 = 1 в булевом, но я ожидаю 1 + 1 = 0. Следовательно, решение может быть новым настроенным скалярным типом. Но как это работает? Также приветствуются некоторые предложения других пакетов или программного обеспечения.Как решить разреженную линейную систему с коэффициентами в Z_2?
ответ
Поскольку операторы для основных типов не могут быть перегружены. Вам нужен настраиваемый скалярный тип. Вот основной документ, рассказывающий вам, как это сделать.
http://eigen.tuxfamily.org/dox/TopicCustomizingEigen.html#CustomScalarType
В основном вам нужно сделать 3 вещи.
- убедитесь, что общий оператор (+, -., *,/И т.д.), которые поддерживаются типа T
- добавить специализацию STRUCT Эйген :: NumTraits
- определяют математические функции это имеет смысл для вашего типа. Это включает стандартные, такие как sqrt, pow, sin, tan, conj, real, imag и т. Д., А также abs2, который является Eigen специфическим. (См файл Эйген/SRC/CORE/MathFunctions.h)
На самом деле вы можете определить только те операторы и математические функции, которые необходимы для решения уравнения.
Приведенная выше ссылка представляет собой простой пример для типа adtl::adouble
. Код очень короткий, потому что большая часть операций уже определена. В исходном источнике unsupported/
есть еще одна сторонняя форма поддержки mpfr::mpreal
. Вы можете начать с этой ссылки.
https://eigen.tuxfamily.org/dox/unsupported/group__MPRealSupport__Module.html
В исходной директории Эйгена эти файлы связаны с поддержкой 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
Да, теперь я знаю, что^- правильный оператор. Однако, как я уже говорил, я хочу решить разреженную линейную систему, используя пакет Eigen. Поэтому на самом деле я хочу сначала определить bool -значную матрицу, такую как Eigen :: Matrix (m, n, BOOL), этот BOOL - это тип bool с модифицированным оператором, как вы сказали. Я не знаю, как это реализовать. –
@ Misery я вижу. Вот почему вам нужна перегрузка. – kangshiyin
это потрясающе. Я очень благодарен. Но для того, чтобы решить линейную систему, мне все равно придется перегружать много операторов, таких как -,>, ... Большинство из них работают хорошо, за исключением того, что: 1. Мне нужно перегрузить некоторые функции, такие как sqrt, abs, я сделал это выглядит так: 'namespace std {Z2 :: Scalar abs (Z2 :: Scalar & a) {return a.data; } Z2 :: Scalar sqrt (Z2 :: Scalar & a) {return a.данные; }} «Но он все еще не работал и сказал, что никакой подходящей функции. Есть ли у вас какие-либо идеи? –
- 1. Как решить большую разреженную линейную систему от Scala
- 2. Как решить линейную систему в оболочке Linux?
- 3. Решить линейную систему уравнений с символическими выражениями
- 4. Sympy не может решить линейную систему ODE
- 5. Решите двоичную линейную систему + SAGE
- 6. Решите разреженную верхнюю треугольную систему
- 7. Как решить уравнение с тремя неизвестными коэффициентами в Matlab?
- 8. Как решить символическое уравнение с двойными коэффициентами в Matlab?
- 9. Решите линейную систему в Python без NumPy
- 10. Могу ли я решить оды с комплексными коэффициентами в matlab?
- 11. Как решить линейную систему с использованием трехзначного выходного вектора представления данных в качестве входных данных для Cholesky?
- 12. Как решить линейную систему уравнений с использованием библиотеки colt в java
- 13. Как решить непоследовательную систему?
- 14. решить в Matlab квадратное уравнение с очень малыми коэффициентами
- 15. Как решить линейную программирование в Matlab в каноническом представлении?
- 16. Как я могу решить систему линейных уравнений в SymPy?
- 17. Python: как решить систему уравнений
- 18. Как решить систему уравнений с помощью Java?
- 19. Как алгебраически решить систему уравнений?
- 20. Решить систему матричных матриц
- 21. Как решить систему линейных уравнений в Excel
- 22. Решить систему линейных уравнений
- 23. Как решить систему дифференциальных уравнений в Matlab
- 24. Гаусс решить систему уравнений
- 25. Прогнозировать с коэффициентами biglm
- 26. Как решить уравнения с комплексными коэффициентами с помощью ode45 в MATLAB?
- 27. Как Назначает линейную систему Equation Ответы на массив
- 28. C++ Как решить очень большую систему разреженной линейной системы
- 29. Решить нелинейную систему уравнений с минимальной ошибкой
- 30. Решить нелинейную систему с Scilab ОДУ
Использование оператора^вместо оператора +? – lorro
@lorro почему? 1^1 = 1. –
'^' бит XOR .. – kangshiyin