Очередь Наше Разложение


16

В этом задании я попрошу вас найти QR-разложение квадратной матрицы. QR-разложение матрицы A - это две матрицы Q и R, такие что A = QR . В частности, мы ищем, чтобы Q была ортогональной матрицей (то есть Q T Q = QQ T = I, где 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 qrесть довольно много альтернатив на других языках, которые возвращают и Q, и R : QRDecomposition(Mathematica), matqr(PARI / GP), 128!:0- если я правильно помню - (J), qr(R) ...


Итак ... вы опубликуете это решение J или я?
Адам

@ Адам, я не буду. Идите и опубликуйте его, если хотите.
г-н Xcoder

Почему не 128!:0работает с нулевой матрицей?
Адам


@ LuisMendo Большое спасибо за исправление!
Мистер Кскодер




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#Numeric_stability

Используемый отступ:

  1. 1 пробел
  2. 1 вкладка

2
При отступе вы можете сохранять байты, используя ;отдельные строки. Вы также можете часто отказаться от разрыва строки после :. Я бы посоветовал поиграть с ними, потому что я вижу несколько мест, где этот ответ может быть короче с использованием этой техники.
Пост Рок Гарф Хантер

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

1
К сожалению, это не будет работать для матриц с пустыми строками.
Деннис

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.