Une matrice orthogonale est une matrice carrée avec des entrées réelles dont les colonnes et les lignes sont des vecteurs unitaires orthogonaux (c.-à-d. Des vecteurs orthonormaux).
Cela signifie que M ^ TM = I, où I est la matrice d'identité et ^ T signifie la transposition matricielle.
Notez que ce n'est pas orthogonal "spécial orthogonal", donc le déterminant de M peut être 1 ou -1.
Le but de ce défi n'est pas la précision de la machine, donc si M ^ TM = I à 4 décimales près, ça ira.
La tâche consiste à écrire du code qui prend un entier positif n > 1
et génère une matrice orthogonale aléatoire n par n . La matrice doit être choisie de manière aléatoire et uniforme parmi toutes les matrices orthogonales n par n. Dans ce contexte, "uniforme" est défini en termes de la mesure de Haar, qui exige essentiellement que la distribution ne change pas si elle est multipliée par une matrice orthogonale librement choisie. Cela signifie que les valeurs de la matrice seront des valeurs à virgule flottante comprises entre -1 et 1.
L'entrée et la sortie peuvent prendre n'importe quelle forme que vous jugez pratique.
Veuillez montrer un exemple explicite de l'exécution de votre code.
Vous ne pouvez utiliser aucune fonction de bibliothèque existante qui crée des matrices orthogonales. Cette règle est un peu subtile donc je vais vous expliquer plus. Cette règle interdit l'utilisation de toute fonction existante qui accepte certaines entrées (ou aucune) et génère une matrice de taille au moins n par n qui est garantie d'être orthogonale. À titre d'exemple extrême, si vous voulez la matrice d'identité n par n, vous devrez la créer vous-même.
Vous pouvez utiliser n'importe quelle bibliothèque de générateur de nombres aléatoires standard pour choisir des nombres aléatoires de votre choix.
Votre code devrait se terminer en quelques secondes au maximum n < 50
.
diag
? Il crée une matrice diagonale qui est en effet orthogonale mais pas toujours orthonormale.diag
devrait aller.Réponses:
Haskell,
169150148141132131 131 octetsÉtendez récursivement une matrice orthogonale de taille
n-1
en ajoutant 1 au coin inférieur droit et appliquez une réflexion aléatoire du chef de ménage.randn
donne une matrice avec des valeurs aléatoires d'une distribution gaussienne etz d
donne un vecteur unitaire uniformément distribué end
dimensions.haussholder tau v
renvoie la matriceI - tau*v*vᵀ
qui n'est pas orthogonale lorsqu'ellev
n'est pas un vecteur unitaire.Usage:
la source
1×1
matrice prend trop de place à mon goût, un cas spécial juste pour obtenir zéro à partir d'une variable aléatoire gaussienne: / (Sans cela, il y a une chance infinitésimale d'obtenir une colonne zéro)Python 2 + NumPy, 163 octets
Merci à xnor d'avoir indiqué d'utiliser des valeurs aléatoires distribuées normales au lieu de valeurs uniformes.
Utilise l' orthogonalisation de Gram Schmidt sur une matrice avec des valeurs aléatoires gaussiennes pour avoir toutes les directions.
Le code de démonstration est suivi de
n = 3:
n = 5:
Il se termine en un clin d'œil pour n = 50 et quelques secondes pour n = 500.
la source
-0.5
n
.Mathematica, 69 octets, probablement non concurrentiel
QRDecomposition
renvoie une paire de matrices, dont la première est garantie orthogonale (et la seconde n'est pas orthogonale, mais triangulaire supérieure). On pourrait soutenir que cela obéit techniquement à la lettre de la restriction dans le message: il ne produit pas une matrice orthogonale, mais une paire de matrices ....Mathematica, 63 octets, définitivement non concurrentiel
Orthogonalize
est sans ambiguïté interdit par le PO. Pourtant, Mathematica est plutôt cool hein?la source
You may not use any existing library function which creates orthogonal **matrices**.