Sebuah matriks ortogonal adalah matriks persegi dengan entri nyata yang kolom dan baris yang ortogonal vektor satuan (yaitu, vektor ortonormal).
Ini berarti bahwa M ^ TM = I, di mana I adalah matriks identitas dan ^ T menandakan transposisi matriks.
Perhatikan bahwa ini adalah ortogonal bukan "ortogonal khusus" sehingga penentu M dapat 1 atau -1.
Tujuan dari tantangan ini bukanlah presisi mesin, jadi jika M ^ TM = I berada dalam 4 tempat desimal yang akan baik-baik saja.
Tugasnya adalah menulis kode yang mengambil bilangan bulat positif n > 1
dan mengeluarkan matriks ortogonal acak n . Matriks harus dipilih secara acak dan seragam dari semua n oleh n matriks ortogonal. Dalam konteks ini, "seragam" didefinisikan dalam hal ukuran Haar, yang pada dasarnya mensyaratkan bahwa distribusi tidak berubah jika dikalikan dengan matriks ortogonal yang dipilih secara bebas. Ini berarti nilai-nilai matriks akan menjadi nilai floating point dalam rentang -1 hingga 1.
Input dan output dapat berupa bentuk apa pun yang Anda rasa nyaman.
Tolong tunjukkan contoh eksplisit dari menjalankan kode Anda.
Anda tidak dapat menggunakan fungsi pustaka yang ada yang membuat matriks ortogonal. Aturan ini sedikit halus sehingga saya akan menjelaskan lebih banyak. Aturan ini melarang penggunaan fungsi apa pun yang ada yang mengambil beberapa (atau tidak ada) input dan output matriks ukuran setidaknya n oleh n yang dijamin ortogonal. Sebagai contoh ekstrem, jika Anda ingin matriks identitas n demi n, Anda harus membuatnya sendiri.
Anda dapat menggunakan pustaka pembangkit nomor acak standar apa pun untuk memilih nomor acak yang Anda pilih.
Kode Anda harus selesai paling lama beberapa detik untuk n < 50
.
diag
? Ini menciptakan matriks diagonal yang memang ortogonal tetapi tidak selalu ortonormal.diag
harus ok.Jawaban:
Haskell,
169150148141132131 byteMemperpanjang secara rekursif matriks ortogonal
n-1
dengan menambahkan 1 ke sudut kanan bawah dan menerapkan refleksi Householder acak.randn
memberikan matriks dengan nilai acak dari distribusi gaussian danz d
memberikan vektor satuan terdistribusi secara merata dalamd
dimensi.haussholder tau v
mengembalikan matriksI - tau*v*vᵀ
yang tidak ortogonal ketikav
bukan merupakan vektor satuan.Pemakaian:
sumber
1×1
matriks membutuhkan terlalu banyak ruang untuk seleraku, kasus khusus hanya untuk mendapatkan nol dari variabel acak gaussian: / (Tanpa itu, ada peluang sangat kecil untuk mendapatkan kolom nol)Python 2 + NumPy, 163 byte
Terima kasih kepada xnor karena menunjukkan untuk menggunakan nilai acak terdistribusi normal bukan yang seragam.
Menggunakan Orthogonalization Gram Schmidt pada matriks dengan nilai acak gaussian untuk memiliki semua arah.
Kode demonstrasi diikuti oleh
n = 3:
n = 5:
Itu selesai dalam sekejap untuk n = 50 dan beberapa detik untuk n = 500.
sumber
-0.5
n
.Mathematica, 69 byte, mungkin tidak bersaing
QRDecomposition
mengembalikan sepasang matriks, yang pertama dijamin orthogonal (dan yang kedua tidak orthogonal, tetapi segitiga atas). Orang bisa berpendapat bahwa ini secara teknis mematuhi surat pembatasan di pos: itu tidak menghasilkan matriks ortogonal, tetapi sepasang matriks ....Mathematica, 63 byte, jelas tidak bersaing
Orthogonalize
jelas-jelas dilarang oleh OP. Tetap saja, Mathematica cukup keren ya?sumber
You may not use any existing library function which creates orthogonal **matrices**.