При поиске алгоритмов матричной инверсии я обнаружил, что есть несколько способов (и мнений!) О том, как сделать это в коде.
Я задавался вопросом, какой метод является самым быстрым, или тот, который имеет лучшую производительность, и пытаясь найти этот ответ, я ничего не нашел.
Я знаю, что в некоторых случаях можно вычислить псевдообратное (используя SVD, cholevsky, …), я фактически использую некоторые из них в своем коде, и я знаю, что несколько раз обратного просто не существует, и т. Д. Легко найти конкретный ответ для конкретной проблемы, но нет общей интуиции для такой большой (ОГРОМНОЙ!) Проблемы, как матричная инверсия.
Итак, мой вопрос:
Какой метод лучше всего подходит для маленьких матриц? А в точности?
Как насчет больших матриц?
Мой личный случай — матрица 6×6 (EDIT: симметричная), которую нужно инвертировать тысячи раз (да, да, с разными значениями), и мне нужна высокая точность, но наверняка скорость будет очень кстати.
Обратите внимание, что я не В поисках кода я сам напишу любой ответ, который больше всего подходит для моего случая, но я думаю, что это вопрос, который многие программисты хотели бы знать.
Здесь нет простого ответа. Убедитесь, что вы прочитали и поняли этот статья.
Для вычисления матриц 2×2 обратное можно сделать с помощью простой формульный с участием определителя. Но для чего-то большего я бы предпочел факторизацию, например, поворотную факторизацию LU. Если вы беспокоитесь о производительности и имеете дело с большими разреженными матрицами, может быть целесообразным итерационный решатель. В качестве альтернативы вы можете попробовать MUMPS (мультифронтальный массивно параллельный решатель) и измерить производительность. Проблема с итерационными решателями заключается в том, что скорость их сходимости сильно зависит от условия обратной задачи и от того, найдете ли вы хорошие предварительные условия.
Возможно, вам следует начать с собственный библиотеки и попробуйте сначала развернуть LU факторизации.
Других решений пока нет …