Швидкий та "Відсталий" (ліворуч)


10

Мені потрібно обчислити багато 3×3 обертання матриць (для полярного розкладання ітерації Ньютона), з дуже малою кількістю вироджених випадків (<0.1%).

Явна зворотна (через матриці неповнолітніх, розділених на детермінант), здається, працює і становить приблизно ~ 32 ~ 40 злиті флопи (залежно від того, як я обчислюю зворотну детермінантну форму). Не враховуючи коефіцієнта детермінальної шкали, це лише 18 злиті флопи (кожен з 9 елементів має форму ab-cd, 2 злиті флопи).

Питання:

  • Чи є спосіб обчислити обернене 3×3 використовуючи менше 18 (з довільною шкалою) або 32 (з належним масштабом, враховуючи зворотні 1 оп) злиті флопи?
  • Чи є економний спосіб (використовуючи ~ 50 f-flops) для обчислення лівої, оберненої назад, стійкої назад 3×3 матриця?

Я використовую одноточні поплавці (гра на iOS). Зворотна стабільність є для мене цікавою новою концепцією, і я хочу експериментувати. Ось стаття, яка спровокувала думку.


А як щодо використання теореми Кейлі-Гамільтона для зворотного?
nicoguaro

1
Якщо це для вас вузьке місце, чи може в цьому випадку інший алгоритм полярного розкладання бути швидшим? Наприклад, через SVD? Або прискорення методу Ньютона, як в 3.3 документа eprints.ma.man.ac.uk/694/01/covered/MIMS_ep2007_9.pdf ?
Кирило

Відповіді:


5

Я спробую роздумати над першим запитанням щодо швидкої3×3обернена . Розглянемо

A=[adgbehcfi]

Оскільки матриці невеликі та дуже загальні (не містять жодної відомої структури, нулів, відносної шкали елементів), я думаю, було б неможливо дати алгоритм довільної шкали (без 1/det(A)) Зворотний , що швидше , ніж 18 плавлених провалів, так як кожен з 9 елементів вимагають 2 злитих провалів, і всі продукти є унікальними і не передбачена ніякої попередньої інформацією про записів «s . Тут позначає ад'югат (переносить кофактори), який по суті є обернена з "довільною шкалою" (за умови наявності зворотної).Aa,,i

A1det(A)=adj(A)=[eifhdifggedhbichaicgahbgcebfafcdaebd]
adj(A)

Однак деякі обчислення можуть бути використані повторно для обчислення . Якщо розгорнути його на перший стовпець (є ще 5 варіантів): Зверніть увагу, що (* ) вже було обчислено під час оцінювання . Отже, зворотний коефіцієнт може бути обчислений у 4 додаткових конденсованих флопах (якщо взаємний вважається 1 флопом).det(A)

det(A)=a(eifh)+b(fgdi)+c(dhge)=a(eifh)b(difg)c(gedh)
adj(A)1/det(A)

Тепер кожне 9 елементів слід масштабувати за допомогою вже отриманого зворотного визначення детермінанта, додаючи ще 9 злитих флопів.adj(A)

Тому,

  1. Обчисліть у 18 плавлених флопахadj(A)
  2. Обчисліть у 3 плавлених флопах, використовуючи записи вже обчисленогоdet(A)adj(A)
  3. Знайдіть (припускаючи 1 флоп).1det(A)
  4. Масштабуйте кожен елемент вже обчисленого за допомогою ще в 9 плавлених флопах.adj(A)1det(A)

У результаті виходить 18 + 3 + 1 + 9 = 31 злиті флопи . Ви не описували свій спосіб обчислення визначника, але, мабуть, можна зберегти 1 додатковий флоп. Або він може бути використаний для виконання перевірки на кроці 3, де є допуском до виродженого (незворотного) випадку, в результаті чого 32 злиті флопи (якщо вважати, що це 1 флоп).|det(A)|>ϵϵif

Я не думаю, що існує більш швидкий спосіб обчислити зворотну загальну матрицю оскільки всі залишилися обчислення є унікальними. Використання Кейлі-Гамільтона не повинно допомогти з точки зору швидкості, як загалом, для деяких інших операцій потрібно буде обчислити для матриці .3×3A23×3

Примітка:

  • ця відповідь не стосується чисельної стійкості
  • можливий потенціал векторизації та оптимізації структури доступу до пам'яті також не обговорюється
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.