কোড গল্ফ একটি এলোমেলো orthogonal ম্যাট্রিক্স


9

অরথোগোনাল ম্যাট্রিক্স একটি বর্গ ম্যাট্রিক্স যার আসল এন্ট্রি রয়েছে যার কলাম এবং সারিগুলি অর্থোগোনাল ইউনিট ভেক্টর (অর্থাত্ অ र्थ নরমাল ভেক্টর)।

এর অর্থ হ'ল এম ^ টিএম = আই, যেখানে আমি পরিচয় ম্যাট্রিক্স এবং ^ টি ম্যাট্রিক্স স্থানান্তরকে নির্দেশ করে।

মনে রাখবেন যে এটি অরথোগোনাল "বিশেষ অर्थোগোনাল" নয় তাই এম এর নির্ধারক 1 বা -1 হতে পারে।

এই চ্যালেঞ্জের উদ্দেশ্যটি মেশিনের নির্ভুলতা নয় তাই যদি এম ^ টিএম = আমি 4 দশমিক জায়গার মধ্যে যাই তবে তা ভাল।

কার্যটি হ'ল কোডটি লিখুন যা একটি ধনাত্মক পূর্ণসংখ্যার গ্রহণ করে n > 1এবং এন ম্যাট্রিক্স দ্বারা একটি এলোমেলো অর্থোগোনাল এন আউটপুট করে । ম্যাট্রিক্স এলোমেলোভাবে এবং অভিন্নভাবে সমস্ত এন থেকে অর্থোগোনাল ম্যাট্রিক্স দ্বারা চয়ন করা উচিত । এই প্রসঙ্গে, "ইউনিফর্ম" হর পরিমাপের নিরিখে সংজ্ঞায়িত করা হয়েছে, যার জন্য প্রয়োজনীয়ভাবে প্রয়োজন যে কোনও অবাধে নির্বাচিত অর্থোগোনাল ম্যাট্রিক্স দ্বারা গুণিত হলে বিতরণ পরিবর্তন হবে না। এর অর্থ ম্যাট্রিক্সের মানগুলি 1-1 থেকে 1 সীমাতে ভাসমান পয়েন্টের মান হবে।

ইনপুট এবং আউটপুট যে কোনও ফর্ম হতে পারে আপনার সুবিধাজনক।

আপনার কোড চলমান একটি স্পষ্ট উদাহরণ প্রদর্শন করুন।

অরথোগোনাল ম্যাট্রিক্স তৈরি করে এমন কোনও বিদ্যমান লাইব্রেরি ফাংশন আপনি ব্যবহার করতে পারবেন না। এই নিয়মটি একটু সূক্ষ্ম তাই আমি আরও ব্যাখ্যা করব। এই নিয়মটি কোনও বিদ্যমান ফাংশনের ব্যবহারকে নিষিদ্ধ করে যা কিছু (বা না) ইনপুট নেয় এবং কমপক্ষে n দ্বারা n এর আকারের ম্যাট্রিক্সকে আউটপুট দেয় যা অরথোগোনাল হওয়ার গ্যারান্টিযুক্ত is চরম উদাহরণ হিসাবে, আপনি যদি এন বাই এন পরিচয় ম্যাট্রিক্স করতে চান তবে আপনাকে এটি নিজে তৈরি করতে হবে।

আপনি নিজের পছন্দমতো এলোমেলো সংখ্যা বাছাইয়ের জন্য যেকোন প্রমিত র্যান্ডম নম্বর জেনারেটর লাইব্রেরি ব্যবহার করতে পারেন।

আপনার কোডটি সর্বাধিক কয়েক সেকেন্ডের মধ্যে শেষ করা উচিত n < 50


সুতরাং অন্তর্নিহিত পরিচয় ম্যাট্রিক্স ব্যবহার নিষিদ্ধ?
জংহওয়ান মিন

@ জেএইচএম আপনি কমপক্ষে এন বাই এন পরিচয় ম্যাট্রিক্স তৈরি করতে এটি ব্যবহার করতে পারবেন না।

কি হবে diag? এটি একটি ডায়াগোনাল ম্যাট্রিক্স তৈরি করে যা সত্যই অরথোগোনাল তবে সর্বদা অরথনোরমিক নয়।
কার্ল ন্যাপফ

এটি "ডু এক্স ছাড়াই ওয়াই" এর উদাহরণ বলে মনে হচ্ছে, যা - তাই sensকমত্য - এড়ানো উচিত।
flawr

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-1নীচে ডান কোণে 1 যোগ করে একটি এরিডোগোনাল ম্যাট্রিক্সকে পুনরাবৃত্তভাবে প্রসারিত করুন এবং এলোমেলোভাবে গৃহস্থালি প্রতিচ্ছবি প্রয়োগ করুন। 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

আমি এটি সম্পূর্ণরূপে সঠিক করার আপনার চেতনা পছন্দ করি তবে আমার ধারণা আপনি এই প্রয়োজনীয়তাটি বাদ দিতে পারেন। আমার কোডে এমনও সুযোগ রয়েছে যে ২ টি সারি লম্বা নির্ভরশীল এবং কারওই যত্ন নেই।
কার্ল ন্যাপফ

@ কার্লনাপফ ভাল, আমি যেভাবেই হোক না কেন সেই অংশ থেকে দুটি বাইট হারাবার উপায় খুঁজে পেয়েছি, তাই সমস্যাটি আংশিকভাবে সমাধান হয়েছে :)
অ্যাঙ্গস

আহ ঠিক আছে, আমার মন্তব্য
মুছছে

একটি হাস্কেল উত্তর জিতলে সর্বদা খুশি!

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]]

এটি এন = 50 এর জন্য একটি ঝলক এবং n = 500 এর জন্য কয়েক সেকেন্ডের মধ্যে সম্পূর্ণ হয়।


আমি মনে করি না এটি অভিন্ন। আপনার ঘনক্ষেত্র দিয়ে বিতরণ শুরু হচ্ছে, এতে তির্যকের দিকে আরও স্টাফ রয়েছে। এলোমেলো গৌসিয়ানরা কাজ করবে কারণ তারা একটি গোলাকার সমন্বিত বিতরণ উত্পন্ন করে।
xnor

@ এক্সনোর ফিক্সড ভাগ্যক্রমে, এই ঠিক 1 বাইট আটকানো।
কার্ল ন্যাপফ

@xnor এমনকি আরও ভাগ্যবান, এই জন্য বাইট সংরক্ষিত-0.5
কার্ল Napf

প্রায়, আপনার 0 এর গড় গড় প্রয়োজন তবে এটি আর বেশি নয় n
xnor

-1

ম্যাথমেটিকা, 69 বাইট, সম্ভবত অ-প্রতিযোগিতামূলক

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

QRDecompositionএকজোড়া ম্যাট্রিক প্রদান করে, যার মধ্যে প্রথমটি গ্যারান্টোগোনাল (এবং যার দ্বিতীয়টি অর্থোগোনাল নয়, তবে উপরের ত্রিভুজাকার) হওয়ার গ্যারান্টিযুক্ত। যে কেউ তর্ক করতে পারে যে এই প্রযুক্তিগতভাবে পোস্টে বিধিনিষেধের চিঠিটি মানছে: এটি একটি অর্থোোনাল ম্যাট্রিক্স আউটপুট দেয় না, তবে একজোড়া ম্যাট্রিক্স ....

ম্যাথমেটিকা, 63 বাইট, অবশ্যই প্রতিদ্বন্দ্বী

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

Orthogonalizeওপি কর্তৃক নির্বিঘ্নে নিষিদ্ধ। তবুও, ম্যাথমেটিকাকে খুব সুন্দর এহ?


You may not use any existing library function which creates orthogonal **matrices**.
কার্ল ন্যাপফ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.