कोड गोल्फ एक यादृच्छिक ऑर्थोगोनल मैट्रिक्स


9

एक ऑर्थोगोनल मैट्रिक्स एक वर्गाकार मैट्रिक्स है जिसमें वास्तविक प्रविष्टियाँ होती हैं जिनके स्तंभ और पंक्तियाँ ऑर्थोगोनल यूनिट वैक्टर (जैसे, ऑर्थोनॉमिक वेक्टर) होती हैं।

इसका मतलब यह है कि M ^ TM = I, जहां मैं पहचान मैट्रिक्स हूं और ^ T मैट्रिक्स ट्रांसपोजिशन को दर्शाता है।

ध्यान दें कि यह ओर्थोगोनल नहीं है "विशेष ऑर्थोगोनल" इसलिए एम का निर्धारक 1 या -1 हो सकता है।

इस चुनौती का उद्देश्य मशीन परिशुद्धता नहीं है, यदि M ^ TM = I 4 दशमलव स्थानों के भीतर है जो ठीक होगा।

कार्य कोड लिखना है जो एक सकारात्मक पूर्णांक लेता है n > 1और एन मैट्रिक्स द्वारा एक यादृच्छिक ऑर्थोगोनल एन आउटपुट करता है । मैट्रिक्स को यादृच्छिक रूप से और समान रूप से n ऑर्थोगोनल मेट्रिसेस द्वारा सभी n से चुना जाना चाहिए । इस संदर्भ में, "यूनिफ़ॉर्म" को हार माप के संदर्भ में परिभाषित किया गया है, जिसके लिए अनिवार्य रूप से यह आवश्यक है कि किसी भी स्वतंत्र रूप से चुने गए ऑर्थोगोनल मैट्रिक्स द्वारा गुणा किए जाने पर वितरण में बदलाव न हो। इसका अर्थ है कि मैट्रिक्स के मान -1 से 1 के रेंज में फ्लोटिंग पॉइंट वैल्यू होंगे।

इनपुट और आउटपुट आपको सुविधाजनक लगने वाला कोई भी रूप हो सकता है।

कृपया अपने कोड को चलाने का एक स्पष्ट उदाहरण दिखाएं।

आप किसी भी मौजूदा लाइब्रेरी फ़ंक्शन का उपयोग नहीं कर सकते हैं जो ऑर्थोगोनल मेट्रिसेस बनाता है। यह नियम थोड़ा सूक्ष्म है इसलिए मैं और अधिक समझाऊंगा। यह नियम किसी भी मौजूदा फ़ंक्शन के उपयोग पर प्रतिबंध लगाता है जो कुछ (या नहीं) इनपुट में लेता है और कम से कम n द्वारा आकार के मैट्रिक्स को आउटपुट करता है जो कि ऑर्थोगोनल होने की गारंटी है। एक चरम उदाहरण के रूप में, यदि आप n द्वारा n पहचान मैट्रिक्स चाहते हैं, तो आपको इसे स्वयं बनाना होगा।

आप अपने चयन के यादृच्छिक संख्या को चुनने के लिए किसी भी मानक यादृच्छिक संख्या जनरेटर लाइब्रेरी का उपयोग कर सकते हैं।

आपका कोड अधिकतम कुछ सेकंड में पूरा हो जाना चाहिए n < 50


तो अंतर्निहित पहचान मैट्रिक्स का उपयोग करना मना है?
जुंगह्वान मिन

@JHM आप इसे कम से कम n पहचान मैट्रिक्स द्वारा n बनाने के लिए उपयोग नहीं कर सकते।

किस बारे में diag? यह एक विकर्ण मैट्रिक्स बनाता है जो वास्तव में ऑर्थोगोनल है, लेकिन हमेशा ऑर्थोनॉर्मल नहीं है।
कार्ल नेफ

यह "डू एक्स विदाउट वाई" का एक उदाहरण प्रतीत होता है, जो - इसलिए सर्वसम्मति - से बचा जाना चाहिए।
दोष नं।

1
विकर्ण मैट्रिक्‍स ऑर्थोगोनल मैट्रिक्‍स नहीं हैं इसलिए diagठीक होना चाहिए।
एंग्स

जवाबों:


7

हास्केल, 169 150 148 141 132 131 बाइट्स

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-11 से निचले दाएं कोने को जोड़कर पुन: आकार के एक ऑर्थोगोनल मैट्रिक्स का विस्तार करें और एक यादृच्छिक हाउसहोल्डर प्रतिबिंब लागू करें। randnएक गौसियन वितरण से यादृच्छिक मूल्यों के साथ एक मैट्रिक्स देता है और आयामों z dमें समान रूप से वितरित इकाई वेक्टर देता dहै।

haussholder tau vवह मैट्रिक्स लौटाता है I - tau*v*vᵀजो vएक यूनिट वेक्टर नहीं होने पर ऑर्थोगोनल नहीं होता है।

उपयोग:

*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×1मैट्रिक्स बनाना मेरे स्वाद के लिए बहुत अधिक जगह लेता है, गॉसियन रैंडम वैरिएबल से शून्य प्राप्त करने के लिए एक विशेष मामला: / (इसके बिना, शून्य कॉलम प्राप्त करने का एक असीम मौका है)
Angs

मुझे यह पूरी तरह से सही बनाने की आपकी भावना पसंद है, लेकिन मुझे लगता है कि आप उस आवश्यकता को छोड़ सकते हैं। मेरे कोड में यह भी एक मौका है कि 2 पंक्तियाँ रैखिक रूप से निर्भर हैं और कोई भी परवाह नहीं करता है।
कार्ल नैप

@ कर्नलनेफ अच्छी तरह से, मुझे लगता है कि वैसे भी उस हिस्से से दो बाइट्स खोने का एक तरीका है, इसलिए समस्या आंशिक रूप से हल हो गई :)
Angs

आह ठीक है, मेरी टिप्पणियों को हटाना ...
कार्ल नेफ

हमेशा खुश जब एक हास्केल जवाब जीतता है!

4

पायथन 2 + न्यूमपी, 163 बाइट्स

वर्दी वालों के बजाय सामान्य वितरित यादृच्छिक मूल्यों का उपयोग करने के लिए इंगित करने के लिए xnor के लिए धन्यवाद।

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

सभी दिशाओं में गॉसियन यादृच्छिक मूल्यों के साथ एक मैट्रिक्स पर ग्राम श्मिट ऑर्थोगोनाइजेशन का उपयोग करता है ।

प्रदर्शन कोड के बाद है

print dot(Q.transpose(),Q)

एन = 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]]

एन = 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 के लिए पलक के भीतर और n = 500 के लिए कुछ सेकंड में पूरा होता है।


मुझे नहीं लगता कि यह एक समान है। एक घन के साथ आपका प्रारंभिक वितरण, जिसमें विकर्णों की ओर अधिक सामान है। यादृच्छिक गाऊसी काम करेंगे क्योंकि वे एक गोलाकार सममित वितरण उत्पन्न करते हैं।
xnor 7

@ एक्सनोर तय। सौभाग्य से, यह ठीक 1 बाइट की लागत।
कार्ल नैप

@xnor और भी भाग्यशाली, इसने बाइट्स को बचाया-0.5
कार्ल नेफ

लगभग, आपको 0 होने के लिए सामान्य के मतलब की आवश्यकता होती है, लेकिन यह अब की तुलना में नहीं है n
xnor

-1

गणितज्ञ, 69 बाइट्स, शायद गैर-प्रतिस्पर्धात्मक

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

QRDecompositionएक जोड़ी मेट्रिसेस लौटाता है, जिसमें से पहला ऑर्थोगोनल होने की गारंटी देता है (और दूसरा जो ऑर्थोगोनल नहीं है, लेकिन ऊपरी त्रिकोणीय है)। कोई यह तर्क दे सकता है कि यह तकनीकी रूप से पोस्ट में प्रतिबंध के पत्र का पालन करता है: यह ऑर्थोगोनल मैट्रिक्स का उत्पादन नहीं करता है, लेकिन मैट्रिसेस की एक जोड़ी ...।

गणितज्ञ, 63 बाइट्स, निश्चित रूप से गैर-प्रतिस्पर्धात्मक

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

Orthogonalizeओपी द्वारा स्पष्ट रूप से निषिद्ध है। फिर भी, Mathematica बहुत अच्छा है एह?


You may not use any existing library function which creates orthogonal **matrices**.
कार्ल नैप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.