Лучший базовый тип для работы с линейной алгеброй - PullRequest
5 голосов
/ 19 декабря 2008

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

Ответы [ 6 ]

6 голосов
/ 19 декабря 2008

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

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

4 голосов
/ 19 декабря 2008

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

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

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

4 голосов
/ 19 декабря 2008

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

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

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

2 голосов
/ 19 декабря 2008

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

1 голос
/ 19 декабря 2008

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

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

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

0 голосов
/ 19 декабря 2008

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

...