Я реализовал класс, который представляет собой специальный тип полиномов в трех переменных, включая перегрузки для ==, +=, -=, *=, +, -, *. Я проверил операторов, и они, кажется, работают нормально. Затем я добавил следующие Numtraits Специализация:
Код: Выделить всё
template struct NumTraits
: GenericNumTraits
{
typedef Polynomial Real;
typedef Polynomial NonInteger;
typedef const Polynomial& Nested;
static inline Real epsilon() { return Polynomial(0); }
static inline Real dummy_precision() { return Polynomial(0); }
static inline int digits10() { return 0; }
enum {
IsInteger = 0,
IsSigned = 1,
IsComplex = 0,
RequireInitialization = 1,
ReadCost = Eigen::HugeCost,
AddCost = Eigen::HugeCost,
MulCost = Eigen::HugeCost
};
};
С приведенной выше специализацией я могу умножить матрицы с помощью моего полинома скалярного типа. Интересно, что если я сохраняю продукт в качестве собственного :: product вместо расчета матрицы непосредственно в собственном :: matrix , а затем вычисляю ее трассировку, я получаю правильный результат. Я понятия не имею, что вызывает это, и код Eigen, к сожалению, слишком сложный для меня, чтобы легко осмотреть себя. Я предполагаю, что Эйген переключается на более оптимизированный алгоритм умножения, когда матрицы больше, и что-то, что он делает в этом случае, не работает должным образом с моей нестандартной скалярной реализацией. При необходимости я добавлю больше информации после запроса.
Подробнее здесь:
https://stackoverflow.com/questions/796 ... om-scalars