คิวการสลายตัวของเรา


16

ในการท้าทายนี้ฉันจะขอให้คุณหาการสลายตัว QR ของเมทริกซ์จตุรัส QR สลายของเมทริกซ์สองเมทริกซ์QและRดังกล่าวว่าA = QR โดยเฉพาะอย่างยิ่งเรากำลังมองหาคิวที่จะเป็นเมทริกซ์มุมฉาก (นั่นคือQ T Q = QQ T = ฉันที่ฉันเป็นตัวตนแบบทวีคูณและTคือทรานส) และRเป็นเมทริกซ์รูปสามเหลี่ยมบน (ทุกค่าต่ำกว่าเส้นทแยงมุมต้อง เป็นศูนย์)

คุณจะเขียนโค้ดที่ใช้เมทริกซ์จตุรัสด้วยวิธีการที่สมเหตุสมผลและแสดงผลการย่อยสลาย QR ด้วยวิธีใด ๆ เมทริกซ์จำนวนมากมีการย่อยสลาย QR จำนวนมาก แต่คุณต้องการเพียงหนึ่งเอาต์พุต

องค์ประกอบของเมทริกซ์ผลลัพธ์ของคุณควรอยู่ในตำแหน่งทศนิยมสองตำแหน่งของคำตอบจริงสำหรับทุกรายการในเมทริกซ์

นี่คือการแข่งขันดังนั้นคำตอบจะได้คะแนนเป็นไบต์ด้วยจำนวนไบต์น้อยกว่าซึ่งเป็นคะแนนที่ดีกว่า


กรณีทดสอบ

เหล่านี้เป็นเพียงผลลัพธ์ที่เป็นไปได้ผลลัพธ์ของคุณไม่จำเป็นต้องตรงกับสิ่งเหล่านี้ทั้งหมดตราบเท่าที่พวกเขาถูกต้อง

0 0 0     1 0 0   0 0 0
0 0 0 ->  0 1 0   0 0 0
0 0 0     0 0 1 , 0 0 0

1 0 0     1 0 0   1 0 0
0 1 0 ->  0 1 0   0 1 0
0 0 1     0 0 1 , 0 0 1

1 2 3     1 0 0   1 2 3
0 3 1 ->  0 1 0   0 3 1
0 0 8     0 0 1 , 0 0 8

0 0 1     0 0 1   1 1 1
0 1 0 ->  0 1 0   0 1 0
1 1 1     1 0 0 , 0 0 1

0 0 0 0 1     0 0 0 0 1   1 0 0 0 1
0 0 0 1 0     0 0 0 1 0   0 1 1 1 0
0 0 1 0 0 ->  0 0 1 0 0   0 0 1 0 0
0 1 1 1 0     0 1 0 0 0   0 0 0 1 0
1 0 0 0 1     1 0 0 0 0 , 0 0 0 0 1

ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
เดนนิส

คำตอบ:


5

จูเลีย 2 ไบต์

qr

ฟังก์ชั่นqrยอมรับตารางเมทริกซ์และผลตอบแทนTupleของการฝึกอบรม: QและR

ลองออนไลน์!


4
ดีใจที่ได้พบคุณ! ไม่ได้สั้นไปกว่านี้ :-)
Luis Mendo

ฉันรู้ว่าคุณจะกลับมาในไม่ช้า ยินดีต้อนรับกลับ! อะไรคือ BTW ในตัว ...
Erik the Outgolfer

5

อ็อกเทฟ , 19 ไบต์

@(x)[[q,r]=qr(x),r]

ลองออนไลน์!

คำตอบ Octave แรกของฉัน \ o /

อ็อคเทฟqrมีตัวเลือกค่อนข้างน้อยในภาษาอื่นที่ให้ทั้งQและR : QRDecomposition(Mathematica), matqr(PARI / GP) 128!:0- ถ้าฉันจำได้ถูกต้อง - (J), qr(R) ...


ดังนั้น…คุณจะโพสต์คำตอบ J ว่าหรือฉันจะ?
อดัม

@ Adam ฉันจะไม่ ไปข้างหน้าและโพสต์ถ้าคุณต้องการ
นาย Xcoder

ทำไมไม่128!:0ทำงานในทุกศูนย์matrix‽
อดัม


@ LuisMendo ขอบคุณมากสำหรับการแก้ไข!
Mr. Xcoder


3

R , 38 37 ไบต์

pryr::f(list(qr.R(q<-qr(m)),qr.Q(q)))

ลองออนไลน์!


1
คุณไม่ต้องการพื้นที่นั้น ... pryr::f(list(qr.R(q<-qr(m)),qr.R(q)))
นาย Xcoder


@ Mr.Xcoder ขอบคุณ!
rturnbull

@ Adámขอบคุณฉันพิมพ์ผิดโง่ แก้ไขแล้ว
rturnbull


1

Python 2, 329 324 ไบต์

import fractions
I=lambda v,w:sum(a*b for a,b in zip(v,w))
def f(A):
 A,U=[map(fractions.Fraction,x)for x in zip(*A)],[]
 for a in A:
    u=a
    for v in U:u=[x-y*I(v,a)/I(v,v)for x,y in zip(u,v)]
    U.append(u)
 Q=[[a/I(u,u)**.5 for a in u]for u in U];return zip(*Q),[[I(e,a)*(i>=j)for i,a in enumerate(A)]for j,e in enumerate(Q)]

เราต้องใช้เศษส่วนเพื่อให้ได้ผลลัพธ์ที่ถูกต้องโปรดดูที่https://en.wikipedia.org/wiki/Gram%E2%80%93Schmidt_process#Numerical_stability

เยื้องที่ใช้:

  1. 1 ช่อง
  2. 1 แท็บ

2
เมื่อเยื้องคุณสามารถบันทึกไบต์โดยใช้;เพื่อแยกบรรทัด :นอกจากนี้คุณยังสามารถมักจะละเลยแบ่งบรรทัดหลัง ฉันอยากจะแนะนำให้เล่นกับสิ่งเหล่านี้เพราะฉันสามารถดูบางสถานที่คำตอบนี้จะสั้นลงโดยใช้เทคนิคนี้
โพสต์ Rock Garf Hunter

@WheatWizard ขอบคุณ :)
Tyilo

1
น่าเสียดายนี่จะไม่ทำงานกับเมทริกซ์ที่มีแถว null
Dennis

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.