Как решить () по сравнению с простым умножением матрицы на вектор в производительности? - PullRequest
1 голос
/ 05 апреля 2019

Мне нужно решить большое количество линейных задач с одной и той же матрицей размером в несколько сотен.Стоимость инициализации не имеет значения, но затраты времени выполнения имеют решающее значение.Наивно, мой опыт в Лос-Анджелесе говорит мне, что я должен просто инвертировать свою матрицу и использовать кэшированный инверт для решения каждой из моих линейных задач.Однако в документации Eigen упоминается, что это может быть не лучшим подходом.

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

  1. Каковы различия в скорости и точности между ними.решить () и просто умножить инвертированную матрицу на RHS, если исходная матрица хорошо себя ведет?

  2. Изменится ли ответ, если исходная матрица плохо себя ведет, но не полностью вырождена (ни одно из собственных значений не равно 0, но отношение наибольшего к наименьшему велико)?

Я новичок в Eigen, поэтому я прошу прощения, если это повторяющийся вопрос, я выполнил поиск в архиве перед публикацией.

Ник Гнедин

1 Ответ

0 голосов
/ 05 апреля 2019

Это действительно зависит от многих вещей.Например, если ваша матрица очень мала, накладные расходы на деление (необходимые для .solve()) значительны.Для очень больших матриц накладные расходы .solve() будут уменьшаться.Для матриц с недостатком ранга .solve() может быть быстрее (в зависимости от разложения).Но обычно .solve() должен быть численно более стабильным.

Лучше всего сделать сравнительный анализ и проверить точность (например, путем сравнения остатков каждого метода) для матриц, обычно встречающихся в вашем приложении.

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

...