Эффективный способ вычисления диагонали обратной матрицы

Как лучше всего вычислить диагональ обратной симметричной плотной матрицы (2000 * 2000)? В настоящее время я сначала вычисляю обратное, используя solve(x), а затем извлекаю диагональ (diag(y)). Хотя это работает, но мне интересно, есть ли лучший способ сделать это, чтобы код работал быстрее. Я попробовал chol2inv(), но это не сработало, так как моя матрица не является положительно определенной.

Обновление: для всех, кому это может быть интересно, я смог ускорить инверсию матрицы с помощью оптимизированной математической библиотеки Intel MKL. На моей машине инвертирование матрицы 2000 * 2000 занимает 3 секунды. Intel MKL доступен с Microsoft R Open.


person Katherine    schedule 18.07.2017    source источник
comment
В кратком поиске в Google я нашел довольно много ссылок на алгоритмы и другие реализации, связанные с этой проблемой. Вам явно нужен каждый элемент диагонали или вы собираетесь использовать его в другом расчете? Если вы хотите использовать его в дальнейших вычислениях, эти знания будут иметь решающее значение для ускорения выполнения.   -  person Vandenman    schedule 18.07.2017
comment
Я использую диагональ в других вычислениях. В частности, я делю каждый элемент другого вектора на каждый элемент диагонали обратной матрицы и суммирую их.   -  person Katherine    schedule 19.07.2017
comment
Откуда вы знаете, что каждый элемент диагонали инверсии отличен от нуля? Есть ли у матрицы какое-то свойство, гарантирующее это?   -  person dmuir    schedule 24.07.2017


Ответы (1)


Если ваша матрица не обладает хорошими свойствами, такими как симметричность, диагональ или положительно определенность, ваш единственный выбор, к сожалению, — это сделать sum(diag(solve(x)))

Сколько времени это займет на вашей матрице?

person Alex Braksator    schedule 18.07.2017
comment
Он симметричен, но, к сожалению, не является положительно определенным. Chol2inv будет намного быстрее. На бег ушло около 15 секунд. Время выполнения не страшно, но оно быстро увеличивается, поскольку у меня итеративный процесс, поэтому матрица инвертируется каждый раз в процессе. - person Katherine; 19.07.2017