производительность — более эффективный и быстрый способ инвертирования матриц в c ++ (большой и маленький)

При поиске алгоритмов матричной инверсии я обнаружил, что есть несколько способов (и мнений!) О том, как сделать это в коде.
Я задавался вопросом, какой метод является самым быстрым, или тот, который имеет лучшую производительность, и пытаясь найти этот ответ, я ничего не нашел.

Я знаю, что в некоторых случаях можно вычислить псевдообратное (используя SVD, cholevsky, …), я фактически использую некоторые из них в своем коде, и я знаю, что несколько раз обратного просто не существует, и т. Д. Легко найти конкретный ответ для конкретной проблемы, но нет общей интуиции для такой большой (ОГРОМНОЙ!) Проблемы, как матричная инверсия.

Итак, мой вопрос:

Какой метод лучше всего подходит для маленьких матриц? А в точности?
Как насчет больших матриц?

Мой личный случай — матрица 6×6 (EDIT: симметричная), которую нужно инвертировать тысячи раз (да, да, с разными значениями), и мне нужна высокая точность, но наверняка скорость будет очень кстати.

Обратите внимание, что я не В поисках кода я сам напишу любой ответ, который больше всего подходит для моего случая, но я думаю, что это вопрос, который многие программисты хотели бы знать.

9

Решение

Здесь нет простого ответа. Убедитесь, что вы прочитали и поняли этот статья.

Для вычисления матриц 2×2 обратное можно сделать с помощью простой формульный с участием определителя. Но для чего-то большего я бы предпочел факторизацию, например, поворотную факторизацию LU. Если вы беспокоитесь о производительности и имеете дело с большими разреженными матрицами, может быть целесообразным итерационный решатель. В качестве альтернативы вы можете попробовать MUMPS (мультифронтальный массивно параллельный решатель) и измерить производительность. Проблема с итерационными решателями заключается в том, что скорость их сходимости сильно зависит от условия обратной задачи и от того, найдете ли вы хорошие предварительные условия.

Возможно, вам следует начать с собственный библиотеки и попробуйте сначала развернуть LU факторизации.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]