Coda nostra decomposizione


16

In questa sfida ti chiederò di trovare una decomposizione QR di una matrice quadrata. La decomposizione QR della matrice A è di due matrici Q e R tali che A = QR . In particolare stiamo cercando che Q sia una matrice ortogonale (ovvero Q T Q = QQ T = I dove I è l'identità moltiplicativa e T è la trasposizione) e R che sia una matrice triangolare superiore (ogni valore al di sotto della diagonale deve essere zero).

Scriverai codice che accetta una matrice quadrata con qualsiasi metodo ragionevole e genera una decomposizione QR con qualsiasi metodo. Molte matrici hanno più scomposizioni QR, tuttavia è necessario solo produrne una.

Gli elementi delle matrici risultanti devono trovarsi entro due decimali di una risposta effettiva per ogni voce nella matrice.

Si tratta di una competizione di , quindi le risposte verranno classificate in byte con un numero inferiore di byte con un punteggio migliore.


Casi test

Queste sono solo uscite possibili, le tue uscite non devono necessariamente corrispondere a tutte queste finché sono valide.

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

I commenti non sono per una discussione estesa; questa conversazione è stata spostata in chat .
Dennis,

Risposte:



5

Ottava , 19 byte

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

Provalo online!

La mia prima risposta in Ottava \ o /

Octave qrha alcune alternative in altre lingue che restituiscono sia Q che R : QRDecomposition(Mathematica), matqr(PARI / GP), 128!:0- se ricordo bene - (J), qr(R) ...


Quindi ... pubblicherai quella soluzione J o dovrei?
Adám,

@ Adám non lo farò. Vai avanti e pubblicalo se vuoi.
Mr. Xcoder il

Perché non 128!:0funziona su una matrice tutto zero?
Adám,


@LuisMendo Grazie mille per la correzione!
Mr. Xcoder il




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

Dobbiamo usare le frazioni per garantire un risultato corretto, vedi https://en.wikipedia.org/wiki/Gram%E2%80%93Schmidt_process#Numerical_stability

Rientro utilizzato:

  1. 1 spazio
  2. 1 etichetta

2
Se rientrato, è possibile salvare byte utilizzando ;linee separate. Spesso puoi anche rinunciare all'interruzione di riga dopo :. Suggerirei di giocarci con questi perché vedo alcuni posti in cui questa risposta può essere più breve usando questa tecnica.
Post Rock Garf Hunter,

@WheatWizard Thanks :)
Tyilo,

1
Sfortunatamente, questo non funzionerà per le matrici con righe null.
Dennis,

0

Python con numpy, 28 byte

import numpy
numpy.linalg.qr
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.