Xếp hàng Phân rã của chúng tôi


16

Trong thử thách này, tôi sẽ yêu cầu bạn tìm phân tách QR của ma trận vuông. Phân rã QR của ma trận A là hai ma trận QR sao cho A = QR . Cụ thể, chúng tôi đang tìm kiếm Q là một ma trận trực giao (đó là Q T Q = QQ T = I trong đó tôi là danh tính nhân và T là hoán vị) và R là ma trận tam giác trên (mọi giá trị dưới đường chéo của nó phải bằng không).

Bạn sẽ viết mã lấy ma trận vuông bằng bất kỳ phương thức hợp lý nào và đưa ra phân tách QR theo bất kỳ phương thức nào. Nhiều ma trận có nhiều phân tách QR tuy nhiên bạn chỉ cần một đầu ra.

Các yếu tố của ma trận kết quả của bạn phải nằm trong hai vị trí thập phân của câu trả lời thực tế cho mỗi mục trong ma trận.

Đây là một cuộc thi vì vậy các câu trả lời sẽ được tính bằng byte với ít byte hơn là điểm cao hơn.


Các trường hợp thử nghiệm

Đây chỉ là những đầu ra có thể, đầu ra của bạn không cần phải khớp với tất cả những thứ này miễn là chúng hợp lệ.

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

Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Dennis

Câu trả lời:


5

Julia, 2 byte

qr

Chức năng qrchấp nhận một ma trận vuông và trả về một Tuplema trận: QR .

Hãy thử trực tuyến!


4
Rất vui được gặp bạn! Nó không nhận được bất kỳ ngắn hơn thế này :-)
Luis Mendo

Tôi biết bạn sẽ quay lại sớm. Chào mừng trở lại! Thật là một BTW tích hợp ...
Erik the Outgolfer 27/12/17

5

Octave , 19 byte

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

Hãy thử trực tuyến!

Câu trả lời Octave đầu tiên của tôi \ o /

Octave qrcó khá nhiều lựa chọn thay thế trong các ngôn ngữ khác trả về cả QR : QRDecomposition(Mathicala), matqr(PARI / GP), 128!:0- nếu tôi nhớ chính xác - (J), qr(R) ...


Vì vậy, bạn sẽ đăng giải pháp J đó hay tôi?
Adám

@ Adám tôi sẽ không. Đi trước và gửi nó nếu bạn muốn.
Ông Xcoder

Tại sao không 128!:0hoạt động trên ma trận hoàn toàn bằng không
Adám


@LuisMendo Cảm ơn rất nhiều vì đã sửa chữa!
Ông Xcoder




1

Python 2, 329 324 byte

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

Chúng tôi phải sử dụng phân số để đảm bảo đầu ra chính xác, xem https://en.wikipedia.org/wiki/Gram%E2%80%93Schmidt_ process # Numer_stability

Lõm được sử dụng:

  1. 1 không gian
  2. 1 tab

2
Khi thụt lề, bạn có thể lưu byte bằng cách sử dụng ;để tách các dòng. Bạn cũng có thể thường xuyên từ bỏ dòng ngắt sau :. Tôi sẽ đề nghị chơi xung quanh với những điều này bởi vì tôi có thể thấy một vài nơi câu trả lời này có thể ngắn hơn bằng cách sử dụng kỹ thuật này.
Thuật sĩ lúa mì

@WheatWizard Cảm ơn :)
Tyilo

1
Thật không may, điều này sẽ không hoạt động cho ma trận với các hàng null.
Dennis

0

Python với numpy, 28 byte

import numpy
numpy.linalg.qr
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.