Kod golf rastgele dik matris


9

Bir ortogonal matris sütunlar ve satırlar ortogonal birim vektörleri (yani, ortonormal vektörler) olan gerçek girişlerle bir kare bir matristir.

Bu, M ^ TM = I, burada kimlik matrisi ve ^ T'nin matris transpozisyonunu ifade ettiği anlamına gelir.

Bunun dikgen "özel dik" olmadığını unutmayın, bu nedenle M'nin belirleyicisi 1 veya -1 olabilir.

Bu zorluğun amacı makine hassasiyeti değildir, bu yüzden eğer M ^ TM = I iyi olacak 4 ondalık basamağa çıkarsa.

Görev, pozitif bir tamsayı alan n > 1ve rastgele bir ortogonal n x n matrisi çıkaran kod yazmaktır . Matris, n'den n ortogonal tüm matrislerden rastgele ve düzgün bir şekilde seçilmelidir . Bu bağlamda, "tekdüze", esasen serbestçe seçilen herhangi bir dikey matrisle çarpıldığında dağılımın değişmemesini gerektiren Haar ölçüsü açısından tanımlanır. Bu, matris değerlerinin -1 ila 1 aralığında kayan nokta değerleri olacağı anlamına gelir.

Giriş ve çıkış uygun bulduğunuz herhangi bir form olabilir.

Lütfen kodunuzun açık bir örneğini gösterin.

Dikey matrisler oluşturan varolan bir kütüphane işlevini kullanamazsınız. Bu kural biraz incedir, bu yüzden daha fazla açıklayacağım. Bu kural, bazı girişleri alan (veya hiç) alan ve en az n x n büyüklüğünde bir ortogonal olması garanti edilen bir matris çıktılayan mevcut fonksiyonların kullanımını yasaklar. Aşırı bir örnek olarak, n x n kimlik matrisini istiyorsanız, bunu kendiniz oluşturmanız gerekir.

Seçtiğiniz rastgele sayıları seçmek için herhangi bir standart rastgele sayı üreteci kitaplığını kullanabilirsiniz.

Kodunuzun en fazla birkaç saniye içinde tamamlanması gerekir n < 50.


Yani yerleşik kimlik matrisini kullanmak yasaktır?
JungHwan Min

@JHM En azından bir n x n kimlik matrisi oluşturmak için kullanamazsınız.

Ne olmuş diag? Gerçekten dik fakat her zaman dikey olmayan bir köşegen matris oluşturur.
Karl Napf

Bu, - yani fikir birliği - kaçınılması gereken "Y olmadan X yap" örneğidir.
Kusur

1
Çapraz matrisler dik matrisler değildir, bu yüzden iyi diagolmalıdır.
Angs

Yanıtlar:


7

Haskell'in 169 150 148 141 132 131 bayt

import Numeric.LinearAlgebra
z=(unitary.flatten<$>).randn 1
r 1=asRow<$>z 1
r n=do;m<-r$n-1;(<>diagBlock[m,1]).haussholder 2<$>z n

n-1Sağ alt köşeye 1 ekleyerek dik boyutlu bir matrisi tekrar tekrar genişletin ve rastgele bir Hanehalkı yansıması uygulayın. randnGauss dağılımından rastgele değerlere sahip bir matris z dverir ve dboyutlarda düzgün dağılmış birim vektör verir .

haussholder tau vbirim vektör I - tau*v*vᵀolmadığında dikey olmayan matrisi döndürür v.

Kullanımı:

*Main> m <- r 5
*Main> disp 5 m
5x5
-0.24045  -0.17761   0.01603  -0.83299  -0.46531
-0.94274   0.12031   0.00566   0.29741  -0.09098
-0.02069   0.30417  -0.93612  -0.13759   0.10865
 0.02155  -0.83065  -0.35109   0.32365  -0.28556
-0.22919  -0.41411   0.01141  -0.30659   0.82575
*Main> (<1e-14) . maxElement . abs $ tr m <> m - ident 5
True

1×1Matris yapmak benim zevkime göre çok fazla yer kaplıyor, sadece bir gauss rastgele değişkeninden sıfır almak için özel bir durum: / (Onsuz, sıfır sütun almak için sonsuz bir şans var)
Angs

Tamamen doğru yapma ruhunuzu seviyorum, ancak bu gereksinimi bırakabileceğinizi düşünüyorum. Kodumda, 2 satırın doğrusal olarak bağımlı olma ve kimsenin umursamaması da bir şans.
Karl Napf

@KarlNapf iyi, yine de o kısımdan iki bayt kaybetmenin bir yolunu buldum, bu yüzden sorun kısmen çözüldü :)
Angs

Ah tamam, yorumlarımı
siliyorum

Haskell cevabı kazandığında her zaman mutlu oluruz!

4

Python 2 + NumPy, 163 bayt

Düzgün olanlar yerine normal dağıtılmış rasgele değerler kullandığına işaret ettiği için xnor'a teşekkürler.

from numpy import*
n=input()
Q=random.randn(n,n)
for i in range(n):
 for j in range(i):u=Q[:,j];Q[:,i]-=u*dot(u,Q[:,i])/dot(u,u)
Q/=(Q**2).sum(axis=0)**0.5
print Q

Her yöne sahip olmak için Gauss rasgele değerlere sahip bir matris üzerinde Gram Schmidt Ortogonalizasyonunu kullanır .

Gösteri kodunu

print dot(Q.transpose(),Q)

n = 3:

[[-0.2555327   0.89398324  0.36809917]
 [-0.55727299  0.17492767 -0.81169398]
 [ 0.79003155  0.41254608 -0.45349298]]
[[  1.00000000e+00   0.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   1.00000000e+00  -5.55111512e-17]
 [  0.00000000e+00  -5.55111512e-17   1.00000000e+00]]

n = 5:

[[-0.63470728  0.41984536  0.41569193  0.25708079  0.42659843]
 [-0.36418389  0.06244462 -0.82734663 -0.24066123  0.3479231 ]
 [ 0.07863783  0.7048799   0.08914089 -0.64230492 -0.27651168]
 [ 0.67691426  0.33798442 -0.05984083  0.17555011  0.62702062]
 [-0.01095148 -0.45688226  0.36217501 -0.65773717  0.47681205]]
[[  1.00000000e+00   1.73472348e-16   5.37764278e-17   4.68375339e-17
   -2.23779328e-16]
 [  1.73472348e-16   1.00000000e+00   1.38777878e-16   3.33066907e-16
   -6.38378239e-16]
 [  5.37764278e-17   1.38777878e-16   1.00000000e+00   1.38777878e-16
    1.11022302e-16]
 [  4.68375339e-17   3.33066907e-16   1.38777878e-16   1.00000000e+00
    5.55111512e-16]
 [ -2.23779328e-16  -6.38378239e-16   1.11022302e-16   5.55111512e-16
    1.00000000e+00]]

N = 50 için yanıp sönme ve n = 500 için birkaç saniye içinde tamamlanır.


Bunun tek tip olduğunu düşünmüyorum. Çaprazlara doğru daha fazla şey olan bir küp ile başlangıç ​​dağıtımınız. Rastgele gausslar işe yarayacaktı çünkü küresel olarak simetrik dağılım üretiyorlardı.
xnor

@xnor düzeltildi. Neyse ki, bu tam olarak 1 bayta mal oldu.
Karl Napf

@xnor Daha da şanslı, bu baytları kurtardı-0.5
Karl Napf

Neredeyse, normalin ortalamasının 0 olması gerekir, ancak bu daha fazla değildir n.
xnor

-1

Mathematica, 69 bayt, muhtemelen rakipsiz

#&@@QRDecomposition@Array[RandomVariate@NormalDistribution[]&,{#,#}]&

QRDecompositionbirincisi dik olacağı garanti edilen (ikincisi dik değil üst üçgen) bir çift matris döndürür. Bunun teknik olarak yazıdaki kısıtlama mektubuna uyduğu iddia edilebilir: dikey bir matris değil, bir çift matris çıkarır ....

Mathematica, 63 bayt, kesinlikle rakipsiz

Orthogonalize@Array[RandomVariate@NormalDistribution[]&,{#,#}]&

OrthogonalizeOP tarafından açık bir şekilde yasaklanmıştır. Yine de, Mathematica oldukça havalı ha?


You may not use any existing library function which creates orthogonal **matrices**.
Karl Napf
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.