Eine orthogonale Matrix ist eine quadratische Matrix mit reellen Einträgen, deren Spalten und Zeilen orthogonale Einheitsvektoren (dh orthonormale Vektoren) sind.
Dies bedeutet, dass M ^ TM = I ist, wobei I die Identitätsmatrix ist und ^ T die Matrixtransposition bedeutet.
Es ist zu beachten, dass dies orthogonal und nicht "speziell orthogonal" ist, so dass die Determinante von M 1 oder -1 sein kann.
Das Ziel dieser Herausforderung ist nicht die Maschinengenauigkeit. Wenn also M ^ TM = I innerhalb von 4 Dezimalstellen liegt, ist dies in Ordnung.
Die Aufgabe besteht darin, Code zu schreiben, der eine positive ganze Zahl nimmt n > 1
und eine zufällige orthogonale n mal n-Matrix ausgibt . Die Matrix sollte zufällig und gleichmäßig aus allen n x n orthogonalen Matrizen ausgewählt werden. In diesem Zusammenhang wird "einheitlich" als Haar-Maß definiert, das im Wesentlichen erfordert, dass sich die Verteilung nicht ändert, wenn sie mit einer frei gewählten orthogonalen Matrix multipliziert wird. Dies bedeutet, dass die Werte der Matrix Gleitkommawerte im Bereich von -1 bis 1 sind.
Die Eingabe und Ausgabe kann jede Form sein, die Sie für bequem halten.
Bitte zeigen Sie ein explizites Beispiel für die Ausführung Ihres Codes.
Sie dürfen keine vorhandene Bibliotheksfunktion verwenden, die orthogonale Matrizen erstellt. Diese Regel ist etwas subtil, daher werde ich mehr erklären. Diese Regel verbietet die Verwendung einer vorhandenen Funktion, die einige (oder keine) Eingaben aufnimmt und eine Matrix mit einer Größe von mindestens n mal n ausgibt, die garantiert orthogonal ist. Wenn Sie als extremes Beispiel die n x n-Identitätsmatrix verwenden möchten, müssen Sie sie selbst erstellen.
Sie können jede Standardbibliothek für Zufallszahlengeneratoren verwenden, um Zufallszahlen Ihrer Wahl auszuwählen.
Ihr Code sollte innerhalb von höchstens ein paar Sekunden abgeschlossen sein n < 50
.
diag
? Es wird eine diagonale Matrix erzeugt, die zwar orthogonal, aber nicht immer orthonormal ist.diag
sollten also in Ordnung sein.Antworten:
Haskell,
169150148141132131 BytesErweitern Sie rekursiv eine orthogonale Matrix der Größe,
n-1
indem Sie 1 zur unteren rechten Ecke hinzufügen und eine zufällige Householder-Reflexion anwenden.randn
ergibt eine Matrix mit Zufallswerten aus einer Gaußschen Verteilung undz d
ergibt einen gleichmäßig verteilten Einheitsvektor ind
Dimensionen.haussholder tau v
Gibt die Matrix zurück,I - tau*v*vᵀ
die nicht orthogonal ist, wennv
es sich nicht um einen Einheitsvektor handelt.Verwendungszweck:
quelle
1×1
Matrix nimmt zu viel Platz für meinen Geschmack ein, ein Sonderfall, nur um Null aus einer Gaußschen Zufallsvariablen zu erhalten: / (Ohne sie gibt es eine infinitesimale Chance, eine Nullspalte zu erhalten)Python 2 + NumPy, 163 Bytes
Vielen Dank an xnor für den Hinweis, normalverteilte Zufallswerte anstelle einheitlicher Werte zu verwenden.
Verwendet die Gram-Schmidt- Orthogonalisierung auf einer Matrix mit Gaußschen Zufallswerten, um alle Richtungen zu haben.
Dem Demonstrationscode folgt
n = 3:
n = 5:
Es wird innerhalb eines Augenblicks für n = 50 und einige Sekunden für n = 500 abgeschlossen.
quelle
-0.5
n
.Mathematica, 69 Bytes, wahrscheinlich nicht konkurrierend
QRDecomposition
gibt ein Paar Matrizen zurück, von denen die erste garantiert orthogonal ist (und die zweite nicht orthogonal, sondern oberes Dreieck ist). Man könnte argumentieren, dass dies technisch dem Buchstaben der Einschränkung im Beitrag entspricht: Es wird keine orthogonale Matrix ausgegeben, sondern ein Paar Matrizen ....Mathematica, 63 Bytes, definitiv nicht konkurrierend
Orthogonalize
ist vom OP eindeutig verboten. Trotzdem ist Mathematica ziemlich cool, oder?quelle
You may not use any existing library function which creates orthogonal **matrices**.