Prostopadłe macierz jest macierzą kwadratową prawdziwych pozycji których kolumny i rzędy prostopadłych wektor jednostkowy (tj wektorów ortonormalnych).
Oznacza to, że M ^ TM = I, gdzie I jest macierzą tożsamości, a ^ T oznacza transpozycję macierzy.
Zauważ, że jest to ortogonalny, a nie „specjalny ortogonalny”, więc wyznacznikiem M może być 1 lub -1.
Celem tego wyzwania nie jest precyzja maszyny, więc jeśli M ^ TM = I do 4 miejsc po przecinku, będzie dobrze.
Zadanie polega na napisaniu kodu, który przyjmuje dodatnią liczbę całkowitą n > 1
i generuje losową prostopadłą macierz n na n . Macierz powinna być losowo i jednolicie wybrana ze wszystkich n przez n macierzy ortogonalnych. W tym kontekście „jednolity” jest definiowany w kategoriach miary Haara, która zasadniczo wymaga, aby rozkład nie zmieniał się, jeśli zostanie pomnożony przez dowolną dowolnie wybraną macierz ortogonalną. Oznacza to, że wartości macierzy będą wartościami zmiennoprzecinkowymi z zakresu od -1 do 1.
Dane wejściowe i wyjściowe mogą mieć dowolną formę, którą uznasz za dogodną.
Pokaż wyraźny przykład działającego kodu.
Nie możesz używać żadnej istniejącej funkcji bibliotecznej, która tworzy macierze ortogonalne. Ta zasada jest trochę subtelna, więc wyjaśnię więcej. Ta reguła zabrania używania dowolnej istniejącej funkcji, która pobiera niektóre (lub nie) dane wejściowe i generuje macierz wielkości co najmniej n na n, która jest gwarantowana jako ortogonalna. Jako skrajny przykład, jeśli chcesz macierzy tożsamości n na n, będziesz musiał ją stworzyć sam.
Możesz użyć dowolnej standardowej biblioteki generatora liczb losowych do wyboru wybranych liczb losowych.
Twój kod powinien zakończyć się w ciągu najwyżej kilku sekund n < 50
.
diag
? Tworzy macierz diagonalną, która jest rzeczywiście ortogonalna, ale nie zawsze ortonormalna.diag
powinny być w porządku.Odpowiedzi:
Haskell,
169150148141132131 bajtówRekurencyjnie rozszerz ortogonalną macierz wielkości
n-1
, dodając 1 do prawego dolnego rogu i zastosuj losowe odbicie Householdera.randn
daje macierz z losowymi wartościami z rozkładu gaussowskiego iz d
daje równomiernie rozłożony wektor jednostkowy wd
wymiarach.haussholder tau v
zwraca macierz,I - tau*v*vᵀ
która nie jest ortogonalna, gdyv
nie jest wektorem jednostkowym.Stosowanie:
źródło
1×1
matrycy zajmuje zbyt dużo miejsca jak na mój gust, szczególny przypadek po prostu uzyskania zera z losowej zmiennej gaussowskiej: / (Bez niej istnieje nieskończona szansa na uzyskanie kolumny zerowej)Python 2 + NumPy, 163 bajty
Dzięki xnor za wskazanie, aby użyć normalnie rozmieszczonych losowych wartości zamiast jednolitych.
Wykorzystuje ortogonalizację Grama Schmidta na macierzy z losowymi wartościami gaussowskimi, aby mieć wszystkie kierunki.
Po kodzie demonstracyjnym następuje
n = 3:
n = 5:
Wykonuje się w mgnieniu oka dla n = 50 i kilku sekund dla n = 500.
źródło
-0.5
n
.Mathematica, 69 bajtów, prawdopodobnie nie konkuruje
QRDecomposition
zwraca parę macierzy, z których pierwsza gwarantuje, że jest ortogonalna (a druga nie jest ortogonalna, ale górna trójkątna). Można argumentować, że technicznie jest to zgodne z literą ograniczenia w poście: nie wyprowadza matrycy ortogonalnej, ale parę macierzy ...Mathematica, 63 bajty, zdecydowanie niekonkurujące
Orthogonalize
jest jednoznacznie zabroniony przez OP. Nadal Mathematica jest całkiem fajna, prawda?źródło
You may not use any existing library function which creates orthogonal **matrices**.