Черга нашого розкладу


16

У цьому виклику я попрошу вас знайти QR-розклад квадратної матриці. QR-розкладання матриці A - це дві матриці Q і R такі, що A = QR . Зокрема, ми шукаємо, щоб Q був ортогональною матрицею (тобто Q T Q = QQ T = I, де я - мультиплікативна тотожність, а 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

Октава , 19 байт

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

Спробуйте в Інтернеті!

Моя перша відповідь Октави \ о /

У Octave's qrє досить багато альтернатив на інших мовах, які повертають і Q, і R : QRDecomposition(Mathematica), matqr(PARI / GP), 128!:0- якщо я правильно згадую - (J), qr(R) ...


Отже ... чи ви опублікуєте це рішення J чи я буду?
Adám

@ Adám Я не буду. Вперед і опублікуйте, якщо хочете.
Містер Xcoder

Чому не 128!:0працює над матрицею з усіма нулями‽
Adám


@LuisMendo Дякую за виправлення!
Містер Xcoder




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
У відступі ви можете зберігати байти, використовуючи ;роздільні рядки. Ви також можете часто відмовитися від розриву лінії після :. Я б запропонував пограти з цими, бо я бачу, що в декількох місцях ця відповідь може бути коротшою за допомогою цієї методики.
Пост Рок-Гарф Мисливець

@WheatWizard Спасибі :)
Tyilo

1
На жаль, це не працюватиме для матриць із нульовими рядками.
Денніс

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.