Una matrice ortogonale è una matrice quadrata con voci reali le cui colonne e file sono vettori di unità ortogonali (cioè vettori ortogonali).
Ciò significa che M ^ TM = I, dove I è la matrice dell'identità e ^ T indica la trasposizione della matrice.
Si noti che questo non è ortogonale "ortogonale speciale", quindi il determinante di M può essere 1 o -1.
Lo scopo di questa sfida non è la precisione della macchina, quindi se M ^ TM = I entro 4 decimali andrà bene.
Il compito è scrivere un codice che accetta un numero intero positivo n > 1
e genera una matrice ortogonale n per n casuale . La matrice deve essere scelta casualmente e uniformemente da tutte le matrici n da n ortogonali. In questo contesto, "uniforme" è definita in termini della misura di Haar, che richiede essenzialmente che la distribuzione non cambi se moltiplicata per qualsiasi matrice ortogonale liberamente scelta. Ciò significa che i valori della matrice saranno valori in virgola mobile nell'intervallo da -1 a 1.
L'input e l'output possono essere in qualsiasi forma che ritieni conveniente.
Si prega di mostrare un esempio esplicito del codice in esecuzione.
Non è possibile utilizzare alcuna funzione di libreria esistente che crea matrici ortogonali. Questa regola è un po 'sottile, quindi spiegherò di più. Questa regola vieta l'uso di qualsiasi funzione esistente che accetta alcuni (o nessun) input e genera una matrice di dimensioni almeno n per n che è garantita essere ortogonale. A titolo di esempio estremo, se si desidera la matrice identità n per n, è necessario crearla da soli.
È possibile utilizzare qualsiasi libreria di generatore di numeri casuali standard per scegliere numeri casuali di propria scelta.
Il codice dovrebbe essere completato al massimo entro pochi secondi per n < 50
.
diag
? Crea una matrice diagonale che è davvero ortogonale ma non sempre ortogonale.
diag
dovrebbe essere ok.