J'ai besoin de calculer beaucoup d' inverses matricielles (pour la décomposition polaire d'itération de Newton), avec un très petit nombre de cas dégénérés ( ).
L'inverse explicite (via les matrices mineures divisées par le déterminant) semble fonctionner, et est d'environ ~ 32 ~ 40 flops fusionnés (selon la façon dont je calcule la réciproque du déterminant). Sans tenir compte du facteur d'échelle det, ce ne sont que 18 flops fusionnés (chacun des 9 éléments est de la forme ab-cd, 2 flops fusionnés).
Question:
- Existe-t-il un moyen de calculer l'inverse de utilisant moins de 18 (avec une échelle arbitraire) ou 32 (avec une échelle appropriée, en considérant la réciproque 1 op) flops fusionnés?
- Existe-t-il un moyen économique (en utilisant ~ 50 f-flops) pour calculer un inverse gauche stable vers l'arrière d'une matrice ?
J'utilise des flotteurs simple précision (jeu iOS). La stabilité arrière est un nouveau concept intéressant pour moi et je veux expérimenter. Voici l'article qui a provoqué la réflexion.
matrix
matrix-equations
inverse
matrix-factorization
Sergiy Migdalskiy
la source
la source
Réponses:
Je vais essayer de donner ma pensée sur la première question concernant l' inverse rapide de3×3 . Considérer
Étant donné que les matrices sont petites et très générales (ne présentent aucune structure connue, zéros, échelles relatives des éléments), je pense qu'il serait impossible de donner un algorithme d'échelle arbitraire (sans ) inverse est plus rapide que 18 flops fusionnés, comme chacun des 9 éléments nécessite 2 flops fusionnés, et tous les produits sont uniques, fourni aucune information préalable sur entrées d » . Ici, désigne l'adjugate (transposition des cofacteurs), qui est essentiellement un inverse avec "échelle arbitraire" (à condition que l'inverse existe).1/det(A) A a,…,i
Cependant, certains calculs peuvent être réutilisés pour le calcul de . Si je le développe sur la première colonne (5 autres choix sont disponibles): Remarquez que (* ) a déjà été calculé lors de l'évaluation de . Ainsi, l'inverse du déterminant peut être calculé en 4 flops fusionnés supplémentaires (si réciproque est considéré comme 1 flop).det(A)
Maintenant, chacun des 9 éléments du doit être mis à l'échelle par l'inverse déjà obtenu du déterminant, en ajoutant 9 autres flops fusionnés.adj(A)
Donc,
Résultat: 18 + 3 + 1 + 9 = 31 flops fusionnés . Vous n'avez pas décrit votre façon de calculer le déterminant, mais je suppose qu'un flop supplémentaire peut être enregistré. Ou il peut être utilisé pour effectuer la vérification à l'étape 3, où est la tolérance pour le cas dégénéré (non inversible), résultant en 32 flops fusionnés (en supposant qu'il y ait 1 flop).|det(A)|>ϵ ϵ
if
Je ne pense pas qu'il existe un moyen plus rapide de calculer l'inverse d'une matrice générale car tous les calculs restants sont uniques. L'utilisation de Cayley-Hamilton ne devrait pas aider du point de vue de la vitesse, car en général, il faudra calculer pour une matrice plus de certaines autres opérations.3×3 A2 3×3
NB:
la source