Kuyruk Ayrıştırmamız


16

Bu meydan okumada sizden bir kare matrisin QR ayrışmasını bulmanızı isteyeceğim. Matris QR ayrışma A iki matrisler olan S ve R, öyle ki , A = QR . Özellikle de aradığınız Q (bir ortogonal matris olması S , T , Q = QQ T = I burada I çarpımsal kimlik ve T devrik olduğu) ve R, bir üst üçgen matrisi (diagonal zorunluluk altındaki her bir değer olduğu sıfır).

Herhangi bir makul yöntemle bir kare matrisi alan ve herhangi bir yöntemle bir QR ayrışımı sağlayan bir kod yazacaksınız. Birçok matrisin birden fazla QR ayrışımı vardır, ancak yalnızca bir çıkışa ihtiyacınız vardır.

Ortaya çıkan matrislerin elemanları, matristeki her giriş için gerçek bir cevabın iki ondalık basamağı içinde olmalıdır.

Bu bir yarışmasıdır, bu nedenle cevaplar daha az bayt daha iyi bir puan olmak üzere bayt cinsinden puanlanır.


Test Durumları

Bunlar sadece olası çıktılardır, çıktılarınızın geçerli olduğu sürece bunların hepsiyle eşleşmesi gerekmez.

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

Yorumlar uzun tartışmalar için değildir; bu görüşme sohbete taşındı .
Dennis

Yanıtlar:


5

Julia, 2 bayt

qr

İşlev qr, bir kare matris kabul eder ve bir döner Tuplematrislerin: Q ve R ' .

Çevrimiçi deneyin!


4
Seni gördüğüme sevindim! Bundan daha kısa olamaz :-)
Luis Mendo

Kısa süre sonra geri döneceğini biliyordum. Tekrar hoşgeldiniz! Ne dahili bir BTW ...
Outgolfer Erik

5

Oktav , 19 bayt

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

Çevrimiçi deneyin!

İlk Oktav cevabım \ o /

Octave en qrhem dönmek Diğer dillerde epeyce alternatifleri vardır Q ve R : QRDecomposition(Mathematica), matqr(PARI / GP) 128!:0- eğer doğru geri çağırmak - (J), qr(R) ...


Yani… bu J çözümünü yayınlayacak mısınız yoksa ben mi?
Adám

@ Ben yapmayacağım. Devam edin ve isterseniz gönderin.
Bay Xcoder

Neden 128!:0tamamen sıfır bir matris üzerinde çalışmıyor‽
Adám


@LuisMendo Düzeltme için çok teşekkürler!
Bay Xcoder




1

Python 2, 329324 bayt

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

Doğru çıktı elde etmek için kesirler kullanmalıyız, bkz. Https://en.wikipedia.org/wiki/Gram%E2%80%93Schmidt_process#Numerical_stability

Kullanılan girinti:

  1. 1 boşluk
  2. 1 sekme

2
Girintili olduğunda, ;satırları ayırmak için kullanarak bayt kaydedebilirsiniz . Ayrıca genellikle satır sonundan da vazgeçebilirsiniz :. Bunlarla oynamayı öneririm, çünkü bu tekniği kullanarak bu cevabın daha kısa olabileceği birkaç yer görebiliyorum.
Rock Garf Hunter Post

@WheatWizard Thanks :)
Tyilo

1
Ne yazık ki, bu boş satırlara sahip matrisler için işe yaramaz.
Dennis

0

Numpy ile Python, 28 bayt

import numpy
numpy.linalg.qr
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.