Лучший базовый тип для работы с линейной алгеброй

Я пишу небольшую и неадекватную библиотеку линейной алгебры на C++ для проекта (извините). Я реализую матрицы и операции, используя числа двойной точности. Я делаю правильно? Должен ли я вместо этого реализовать класс шаблона? Есть ли более точный тип вокруг?


person tunnuz    schedule 19.12.2008    source источник


Ответы (6)


Я написал библиотеку линейной алгебры С++, используя шаблоны. Я подумал, что когда-нибудь мы, возможно, захотим использовать комплексные числа или числа повышенной точности. Это было, наверное, семь лет назад, и мы еще этого не сделали. Мы почти всегда используем double в качестве типа шаблона, и у нас есть typedef, чтобы сделать это проще.

Несколько раз мы пошли другим путем, используя типы меньше, чем double. Например, мы использовали float вместо double в приложении с привязкой к памяти, описанном здесь< /а>. Но в 99,9% случаев мы используем двойники.

Если вы используете аргумент шаблона, следите за тем, чтобы использовать целочисленный тип, но неявно требующий тип с плавающей запятой. Например, предположим, что у вас есть матрица, все записи которой являются целыми числами, поэтому вы используете класс matrix‹int›. Но затем вы передаете это линейному решателю. Теперь ваши арифметические действия выполняются с использованием целочисленного деления, и ваши результаты неверны. (Я сделал это!)

person John D. Cook    schedule 19.12.2008
comment
Что ж, прошло семь лет. Но, может быть, когда-нибудь он мне понадобится. На всякий случай лучше написать прямо сейчас. :-) - person John D. Cook; 19.12.2008

Я бы реализовал класс/структуру, используя шаблон. В начале вы, скорее всего, будете довольствоваться только double, но я обнаружил, что в каждом проекте, где я не реализовал матрицы как шаблоны, позже сожалел об этом.

Кроме того, это дает вам возможность использовать более интересные алгебры элементов - интервальную арифметику, распределения вероятностей, сложную математику, сопоставление с фиксированной точкой, подматрицы, простую математику :-) и т. д.

person Frank Krueger    schedule 19.12.2008

Я пишу небольшую и неадекватную библиотеку линейной алгебры на C++ для проекта (извините)

ОЙ! Будьте осторожны, будьте очень-очень осторожны... Проверьте JAMA/TNT — это получил одобрение NIST, и они уже обработали некоторые из «более простых» математических операций линейной алгебры, например. различные алгоритмы факторинга. Линейная алгебра включает в себя множество сложных вопросов с числовой точностью (например, матрицы Гильберта) и многое другое. например, заниматься своими делами, это одна из тех областей, где вы, возможно, захотите использовать хорошую прочную основу, которая уже была хорошо протестирована.

Вы должны иметь возможность использовать с ним long double (не совсем уверен в этом), но сами алгоритмы, вероятно, более важны, чем точность матриц.

person Jason S    schedule 19.12.2008
comment
На самом деле это зависит от того, нужно ли реализовать библиотеку или библиотека нужна, а Томмазо Урли просто не знал об этом. Если цель состоит в том, чтобы реализовать его, обратитесь к своим книгам по числовому анализу. Есть опасные операции с очень большими/маленькими плавающими точками. - person Calyth; 19.12.2008

Ответ на последний вопрос: Да, есть, он называется long double и по крайней мере так же точен, как double. Для использования шаблонов или нет, да, я бы использовал шаблоны. Это отличный вариант использования для них, и я думаю, что это облегчит перенос на какой-то другой скалярный тип числа. Затем вы также можете просто ввести число с плавающей запятой и / или двойную матрицу, в зависимости от системы, в которой вы работаете, и какая из них работает быстрее / лучше.

person Johannes Schaub - litb    schedule 19.12.2008

Не делайте для себя лишней работы. Если вы можете обойтись двойным (или длинным двойным), используйте его.

Похоже, это всего лишь небольшой проект, и в этом случае шаблон просто заставит вас работать.

Другой вариант, который не обсуждался, — это использование шаблона для определения типа вашего элемента. Это не требует много дополнительной работы, если таковая имеется, но позволяет внести некоторые изменения позже.

person David Norman    schedule 19.12.2008

Нет другого более точного типа, чем long double, который также имеет аппаратную поддержку. Но вы можете создавать свои собственные типы, если чувствуете потребность в большей точности. Однако они будут намного медленнее, чем собственный тип double, даже с обширной оптимизацией.

person Vilx-    schedule 19.12.2008