opérateur Matrix-exponentiation - Code de Rosetta

C ne prend pas en charge les classes ou permettre la surcharge des opérateurs. Ce qui suit est un code qui définit une fonction, SquareMtxPower qui permettra de recueillir une matrice à une puissance entière positive.







Ceci est une implémentation en C ++.

Ceci est la partie de la tâche.

Une autre façon serait de mettre en œuvre l'opérateur * = et la conversion du numéro (ce qui donne des multiples de la matrice d'identité) pour la matrice et utiliser le code générique de l'opérateur Exponentiation # C ++ avec le soutien pour les exposants négatifs retirés (ou encore, mettre en œuvre l'inversion de la matrice et , mettre en œuvre / = en termes de celui-ci, et utiliser le code générique inchangé). Notez que l'algorithme utilisé, il est beaucoup plus rapide aussi.

Cette implémentation Common Lisp utilise des tableaux 2D pour représenter des matrices et des contrôles pour vérifier que les tableaux sont les bonnes dimensions pour la multiplication et de la place pour exponentiation.

Celui-ci utilise l'opérateur « * » pour les tableaux tels que définis dans Matrix_multiplication # Chapelle

Exemple d'utilisation (comme Perl):

Maple gère les pouvoirs de la matrice implicitement avec l'opérateur exponentiation intégré:

Si vous voulez des pouvoirs par éléments, vous pouvez utiliser le ^ élément par élément

Dans Mathematica il y a une distinction entre l'alimentation rationnelle des éléments et en tant que matrice. Donc, m ^ 2 m donnera à chaque élément carré. Pour ce faire matrice exponentation nous utilisons la fonction MatrixPower. Il peut traiter tous les types de numéros pour la puissance (les entiers, flottants, rationals, complexes), mais aussi des symboles de la puissance, et tous les types de la matrice (chiffres, symboles et ainsi de suite), et toujours garder le résultat exact si la matrice et l'exposant est exacte.

matrices symboliques comme,> à la puissance m donnent des solutions générales pour tout i possible, j, k, l et m:

donne de retour (notez que la simplification n'est pas nécessaire pour l'évaluation, il donne juste une sortie plus courte):







(2 # X2212; m # X2212; 1 ((i 2 # X2212; 2 i l + 4 j k + l 2 # X2212; i + l) ( # X2212; i 2 # X2212; 2 i l + 4 j k + l 2 + i + l) + m (i 2 # X2212; 2 i l + 4 j k + l + i 2 # X2212; l) (i 2 # X2212; 2 i l + 4 j k + l 2 + i + l) m) i 2 # X2212; 2 i l + 4 j k + l 2 j 2 # X2212; m ((i 2 # X2212; 2 i l + 4 j k + l 2 + i + l) m # X2212; ( # X2212; i 2 # X2212; 2 i l + 4 j k + l 2 + i + l) m) i 2 # X2212; 2 i l + 4 j k + l 2 k 2 # X2212; m ((i 2 # X2212; 2 i l + 4 j k + l 2 + i + l) m # X2212; ( # X2212; i 2 # X2212; 2 i l + 4 j k + l 2 + i + l) m) i 2 # X2212; 2 i l + 4 j k + l 2 2 # X2212; m # X2212; 1 ((i 2 # X2212; 2 i l + 4 j k + l + i 2 # X2212; l) ( # X2212; i 2 # X2212; 2 i l + 4 j k + l 2 + i + l) + m (i 2 # X2212; 2 i l + 4 j k + l 2 # X2212; i + l) (i 2 # X2212; 2 i l + 4 j k + l 2 + i + l) m) i 2 # X2212; 2 il + 4 jk + l 2) \ left (\ left (-2il + 4jk + l ^ >> - i + l \ right) \ left (- 2IL + 4jk + l ^ >> + i + l \ right ) ^ + \ left (-2il + 4jk + l ^ >> + il \ right) \ left (-2il + 4jk + l ^ >> + i + l \ right) ^ \ right)> - + 2IL 4jk + l ^ >>> - \ left (\ left (-2il + 4jk + l ^ >> + i + l \ right) ^ - \ left (- 2IL + 4jk + l ^ >> + i + l \ right) ^ \ right)> - + 2IL 4jk + l ^ >>> gauche \\\ (\ left (-2il + 4jk + l ^ >> + i + l \ right) ^ - \ left (- 2IL + 4jk + l ^ >> + i + l \ right) ^ \ right)> - 2IL + 4jk + l ^ >>> - \ left (\ left (-2il + 4jk + l ^ >> + il \ right) \ left (- -2il + 4jk + l ^ >> + i + l \ right) ^ + \ left (-2il + 4jk + l ^ >> - i + l \ droite) \ left (-2il + 4jk + l ^ >> + i + l \ right) ^ \ right)> - 2IL + 4jk + l ^ >>> \ end> ​​\ right)>

Note finale: Ne pas confondre avec MatrixPower MatrixExp; le premier est de matrice exponentiation, et celle-ci pour la matrice exponentielle (E ^ m).

Pour les exposants sous la forme de A * A * A * A *. * A, A doit être une matrice carrée:

Dans le cas contraire, de prendre les éléments individuels de tableaux à la puissance d'un exposant (la matrice ne doit pas être carré):

Nous allons utiliser certaines fonctions auxiliaires

Maintenant, la puissance de la matrice est simplement un cas particulier de pow:

(Bien sûr, cela ne constitue pas une mise en œuvre, mais il peut être utilisé comme référence pour les résultats)

bibliothèque standard de Ruby fournit déjà l'opérateur matrice exponentiation. Il est # Matrix ** à partir du paquet « matrice » de la bibliothèque standard. IRM 1.9.x met en oeuvre l'opérateur matrice exponentiation dans le fichier matrix.rb. def ** (autour de la ligne 961).

A partir de Ruby 1.9.3, il peut également calculer la matrice ** Float.

Marche avec. Version Ruby 1.9.3

Avec Ruby plus, elle soulève une exception pour Matrix ** Float.

Pour simplifier, la matrice est représentée comme une liste de listes, et aucune vérification de dimension se produit. Cette mise en œuvre ne fonctionne pas lorsque l'exposant est 0.

L'exemple ci-dessous utilise plusieurs caractéristiques de Seed7:

  • Surcharge des opérateurs * et **.
  • Le enable_output modèle. ce qui permet d'écrire une matrice avec écriture (la fonction str doit être définie avant d'appeler enable_output).
  • Une boucle qui fait une boucle sur les valeurs énumérées dans un tableau littéral

Source originale de la matrice exponentiation: [1]