Qr разложение где используется
В численной линейной алгебре , то QR - алгоритм или QR - итерация является алгоритмом собственного значения : то есть процедура для вычисления собственных значений и собственных векторов матрицы А матриц . QR-алгоритм был разработан в конце 1950-х годов Джоном Фрэнсисом и Верой Н. Кублановской , работающими независимо друг от друга. [1] [2] [3] Основная идея состоит в том, чтобы выполнить QR-разложение , записав матрицу как произведение ортогональной матрицы и верхней треугольной матрицы , умножить множители в обратном порядке и повторить итерацию.
расширения
В этом разделе перечислены некоторые идеи по расширению учебника, которые вы, возможно, захотите изучить.
- Создайте 5 примеров, используя каждую операцию со своими собственными данными.
- Найдите документы по машинному обучению и найдите 1 пример каждой используемой операции.
Если вы исследуете какое-либо из этих расширений, я хотел бы знать.
LU Matrix Разложение
Разложение LU предназначено для квадратных матриц и разбивает матрицу на компоненты L и U.
Или без точечной записи.
Где A - квадратная матрица, которую мы хотим разложить, L - матрица нижнего треугольника, а U - матрица верхнего треугольника.
Факторы L и U являются треугольными матрицами. Факторизация, возникающая в результате исключения, равна A = LU.
Разложение LU найдено с помощью итерационного числового процесса и может дать сбой для тех матриц, которые не могут быть легко разложены или разложены.
Вариант этого разложения, который численно более устойчив для решения на практике, называется разложением LUP, или разложением LU с частичным поворотом.
Строки родительской матрицы переупорядочены, чтобы упростить процесс декомпозиции, а дополнительная P-матрица указывает способ перестановки результата или возврата результата в исходный порядок. Есть и другие варианты LU.
Разложение LU часто используется для упрощения решения систем линейных уравнений, например, для нахождения коэффициентов в линейной регрессии, а также для вычисления детерминанта и обратной матрицы.
Декомпозиция LU может быть реализована в Python с помощью функции lu (). Более конкретно, эта функция вычисляет разложение LPU.
В приведенном ниже примере сначала определяется квадратная матрица 3 × 3. Рассчитывается разложение LU, а затем исходная матрица восстанавливается по компонентам.
При выполнении примера сначала печатается определенная матрица 3 × 3, затем компоненты разложения P, L и U, а затем, наконец, восстанавливается исходная матрица.
Обзор учебника
Этот урок разделен на 4 части; они есть:
- Что такое матричная декомпозиция?
- LU Matrix Разложение
- Разложение QR-матрицы
- Холесский Разложение
Прямоугольная матрица
В более общем смысле, мы можем факторизовать комплексную матрицу A размера m × n с m ≥ n как произведение унитарной матрицы Q размера m × m и верхней треугольной матрицы R размера m × n . Поскольку нижние ( m - n ) строк верхней треугольной матрицы размером m × n полностью состоят из нулей, часто бывает полезно разделить R или оба R и Q :
где R 1 - верхняя треугольная матрица размера n × n , 0 - нулевая матрица ( m - n ) × n , Q 1 - это m × n , Q 2 - это m × ( m - n ) , а Q 1 и Q 2 оба имеют ортогональные столбцы.
Голуб и Ван займа (1996 , §5.2) вызова Q 1 R 1 тонкий QR - разложение в A ; Трефетен и Бау называют это сокращенной QR-факторизацией . [1] Если A имеет полный ранг n и мы требуем, чтобы диагональные элементы R 1 были положительными, то R 1 и Q 1 уникальны, но в общем случае Q 2 - нет. R 1 при этом равна верхней треугольной фактор разложения Холецкого из A * A (= A T A , если реальна).
Дальнейшее чтение
Этот раздел предоставляет больше ресурсов по теме, если вы хотите углубиться.
Холесский Разложение
Разложение Холецкого предназначено для квадратных симметричных матриц, где все значения больше нуля, так называемых положительно определенных матриц.
Что касается наших интересов в машинном обучении, мы сосредоточимся на разложении Холецкого для вещественных матриц и проигнорируем случаи при работе с комплексными числами.
Разложение определяется следующим образом:
Или без точечной записи:
Где A - разлагаемая матрица, L - нижняя треугольная матрица, а L ^ T - транспонирование L.
Разложение также может быть записано как произведение верхней треугольной матрицы, например:
Где U - верхняя треугольная матрица.
Разложение Холецкого используется для решения линейных наименьших квадратов для линейной регрессии, а также для методов моделирования и оптимизации.
При разложении симметричных матриц разложение Холецкого почти в два раза эффективнее разложения LU и должно быть предпочтительным в этих случаях.
Хотя симметричные положительно определенные матрицы являются довольно особыми, они встречаются довольно часто в некоторых приложениях, поэтому об их специальной факторизации, называемой разложением Холецкого, полезно знать. Когда вы можете использовать его, разложение Холецкого примерно в два раза быстрее, чем альтернативные методы решения линейных уравнений.
Разложение Cholesky может быть реализовано в NumPy путем вызова функции cholesky (). Функция возвращает только L, так как мы можем легко получить доступ к транспонированию L по мере необходимости.
Приведенный ниже пример определяет симметричную и положительно определенную матрицу 3 × 3 и вычисляет разложение Холецкого, после чего восстанавливается исходная матрица.
При выполнении примера сначала печатается симметричная матрица, затем нижняя треугольная матрица из разложения, за которым следует восстановленная матрица.
QL, RQ и LQ разложения
Аналогичным образом мы можем определить разложения QL, RQ и LQ, где L является нижней треугольной матрицей.
Существует несколько методов реального вычисления QR-разложения, например, с помощью процесса Грама – Шмидта , преобразований Хаусхолдера или вращений Гивенса . У каждого есть ряд преимуществ и недостатков.
Резюме
В этом уроке вы обнаружили матричные декомпозиции и способы их вычисления в Python.
В частности, вы узнали:
- Что такое матричная декомпозиция и почему эти типы операций важны.
- Как рассчитать LU и QR матричные разложения в Python.
- Как рассчитать разложение матрицы Холецкого в Python.
У вас есть вопросы?
Задайте свои вопросы в комментариях ниже, и я сделаю все возможное, чтобы ответить.
В линейной алгебры , A QR - разложение , также известный как QR - разложения или QU разложения является разложением из матрицы A в произведение A = QR в качестве ортогональной матрицы Q и верхней треугольной матрицы R . QR - разложение часто используется для решения линейной наименьших квадратов проблемы и является основой для конкретного собственного значения алгоритма , в QR алгоритма .
книги
- Раздел 6.6 Матричные разложения.Руководство по линейной алгебре, 2017
- Лекция 7 QR Факторизация,Численная линейная алгебра, 1997.
- Раздел 2.3. Разложение ЛУ и его применения,Числовые рецепты: искусство научных вычислений, третье издание, 2007.
- Раздел 2.10 QR-разложение,Численные рецепты: искусство научных вычисленийТретье издание, 2007.
- Раздел 2.9 Разложение Холецкого,Численные рецепты: искусство научных вычисленийТретье издание, 2007.
- Лекция 23, Разложение Холецкого,Численная линейная алгебра, 1997.
СОДЕРЖАНИЕ
Любая вещественная квадратная матрица A может быть разложена как
А знак равно Q р ,
где Q - ортогональная матрица (ее столбцы означают ортогональные единичные векторы ), а R - верхнетреугольная матрица (также называемая правотреугольной матрицей, отсюда и название). Если является обратимым , то разложение единственно , если мы требуем диагональные элементы R , чтобы быть положительным. Q Т знак равно Q - 1 > = Q ^ >
Если вместо этого A - это комплексная квадратная матрица, то существует разложение A = QR, где Q - унитарная матрица (так ). Q * знак равно Q - 1 = Q ^ >
Если имеют п линейно независимые столбцы, то первый п столбцы Q образует ортогональный базис для столбца пространства из A . В более общем смысле, первые k столбцов Q образуют ортонормированный базис для диапазона первых k столбцов A для любого 1 ≤ k ≤ n . [1] Тот факт , что любой столбец к из А зависит только от первых K столбцов Q отвечает за треугольной формы R . [1]
В более общем смысле, мы можем факторизовать комплексную матрицу A размера m × n , где m ≥ n , как произведение унитарной матрицы Q размера m × m и верхней треугольной матрицы R размера m × n . Поскольку нижние ( m - n ) строк верхней треугольной матрицы размером m × n полностью состоят из нулей, часто бывает полезно разделить R или оба R и Q :
где R 1 - верхняя треугольная матрица размера n × n , 0 - нулевая матрица ( m - n ) × n , Q 1 - это m × n , Q 2 - это m × ( m - n ) , а Q 1 и Q 2 оба имеют ортогональные столбцы.
Голуб и Ван займа (1996 , §5.2) вызова Q 1 R 1 тонкий QR - разложение в A ; Трефетен и Бау называют это сокращенной QR-факторизацией . [1] Если A имеет полный ранг n и мы требуем, чтобы диагональные элементы R 1 были положительными, то R 1 и Q 1 уникальны, но в общем случае Q 2 - нет. R 1 при этом равна верхней треугольной фактор разложения Холецкого из А * A (= A T A, если A вещественно).
Аналогичным образом мы можем определить разложения QL, RQ и LQ, где L является нижней треугольной матрицей.
Существует несколько методов реального вычисления QR-разложения, например, с помощью процесса Грама – Шмидта , преобразований Хаусхолдера или вращений Гивенса . У каждого есть ряд преимуществ и недостатков.
Теперь мы можем выразить s по нашему недавно вычисленному ортонормированному базису: a i >
В линейной алгебры , A QR - разложение , также известный как QR - разложения или QU факторизации , является разложение из матрицы A в произведение A = QR в качестве ортогональной матрицы Q и верхней треугольной матрицы R . QR - разложение часто используется для решения линейной наименьших квадратов проблемы и является основой для конкретного собственного значения алгоритма , в QR алгоритма .
Вычисление коэффициентов
Я использую две функции: myQRR и myQRCpp , применяющие процесс Грама-Шмидта для QR-разложения. Одна функция написана на R , а другая на C++ , она загружается в среду R через Rcpp . В конце статьи я сравню их производительность.
Начнем с маленького примера, в котором смоделируем y и X, а затем решим уравнение, используя QR-разложение. Также мы сможем провести двойную проверку QR-разложения — работает ли оно и возвращает ли смоделированный X. Вот смоделированные переменные ответа:
Вот данные, которые мы используем для определения коэффициентов наименьших квадратов. В нашем распоряжении 3 переменные:
Теперь, чтобы найти Q и R , используем myQRCpp .
- Видим, что R действительно верхнетреугольная матрица.
2. Убеждаемся в ортогональности Q.
3. И в том, что QR действительно возвращает исходную матрицу X.
Теперь вычисляем актуальные коэффициенты.
Чтобы проверить, верен ли ответ, сравним вычисленное значение β̂ с тем, что выдает функция lm .
Мы получили в точности то же решение, что и для рассчитанных коэффициентов.
Квадратная матрица
Любая вещественная квадратная матрица A может быть разложена как
А знак равно Q р ,
где Q - ортогональная матрица (ее столбцы - ортогональные единичные векторы, то есть Q Т знак равно Q - 1 > = Q ^ > ), а R - верхнетреугольная матрица (также называемая прямоугольной матрицей). Если является обратимым , то разложение единственно , если мы требуем диагональные элементы R , чтобы быть положительным.
Если вместо этого A - комплексная квадратная матрица, то существует разложение A = QR, где Q - унитарная матрица (так Q * знак равно Q - 1 = Q ^ > ).
Если имеют п линейно независимые столбцы, то первый п столбцы Q образует ортогональный базис для столбца пространства из A . В более общем смысле, первые k столбцов Q образуют ортонормированный базис для диапазона первых k столбцов A для любого 1 ≤ k ≤ n . [1] Тот факт , что любой столбец к из А зависит только от первых K столбцов Q отвечает за треугольную форму R . [1]
СОДЕРЖАНИЕ
Формально, пусть быть реальная матрица , которую мы хотим вычислить собственные значения, и пусть A 0 : = A . На k -м шаге (начиная с k = 0) мы вычисляем QR-разложение A k = Q k R k, где Q k - ортогональная матрица (т.е. Q T = Q −1 ), а R k - верхний треугольник. матрица. Затем формируем A k +1 = R k Q k . Обратите внимание, что
А k + 1 знак равно р k Q k знак равно Q k - 1 Q k р k Q k знак равно Q k - 1 А k Q k знак равно Q k Т А k Q k , =R_Q_=Q_^Q_R_Q_=Q_^A_Q_=Q_^<\mathsf
поэтому все к являются подобны и , следовательно , они имеют одинаковые собственные значения. Алгоритм численно стабилен, потому что он исходит из ортогональных преобразований подобия.
В этой грубой форме итерации относительно дороги. Это можно смягчить, сначала приведя матрицу A к верхней форме Хессенберга (что требует арифметических операций с использованием метода, основанного на редукции Хаусхолдера ) с конечной последовательностью преобразований ортогонального подобия, что-то вроде двустороннего QR-разложения. [5] [6] (Для QR-разложения отражатели Хаусхолдера умножаются только слева, но для случая Хессенберга они умножаются как слева, так и справа.) Определение QR-разложения верхней матрицы Хессенберга стоит 10 3 n 3 + O ( n 2 ) >\end>n^+<\mathcal
Если исходная матрица симметрична , то верхняя матрица Хессенберга также будет симметричной и, следовательно, трехдиагональной , как и все A k . Эта процедура требует затрат на арифметические операции с использованием метода, основанного на редукции Хаусхолдера. [5] [6] Определение QR-разложения симметричной трехдиагональной матрицы требует операций. [7] 4 3 n 3 + O ( n 2 ) >\end>n^+<\mathcal
Скорость сходимости зависит от разделения между собственными значениями, поэтому практический алгоритм будет использовать сдвиги, явные или неявные, для увеличения разделения и ускорения сходимости. Типичный симметричный QR-алгоритм изолирует каждое собственное значение (затем уменьшает размер матрицы) всего за одну или две итерации, что делает его эффективным и надежным. [ требуется разъяснение ]
Поскольку в современной неявной версии процедуры никакие QR-разложения не выполняются явно, некоторые авторы, например Уоткинс [8], предложили изменить ее название на алгоритм Фрэнсиса . Голуб и Ван Лоан используют термин « QR-шаг Фрэнсиса» .
Алгоритм QR можно рассматривать как более сложную вариацию базового алгоритма собственных значений «мощности» . Напомним, что алгоритм мощности многократно умножает A на один вектор, нормализуя после каждой итерации. Вектор сходится к собственному вектору наибольшего собственного значения. Вместо этого алгоритм QR работает с полным базисом векторов, используя разложение QR для перенормировки (и ортогонализации). Для симметричной матрицы A при сходимости AQ = QΛ , где Λ - диагональная матрица собственных значений, к которой сошлась A , и где Q представляет собой композицию всех ортогональных преобразований подобия, необходимых для достижения этой цели. Таким образом, столбцы Q являются собственными векторами.
Алгоритму QR предшествовал алгоритм LR , который использует разложение LU вместо разложения QR. Алгоритм QR более стабилен, поэтому в настоящее время алгоритм LR используется редко. Однако это важный шаг в развитии алгоритма QR.
Алгоритм LR был разработан в начале 1950-х годов Хайнцем Рутисхаузером , который в то время работал научным сотрудником Эдуарда Штифеля в ETH Zurich . Штифель предложил Rutishauser использовать последовательность моментов у 0 Т к х 0 , к = 0, 1, . (где х 0 и у 0 произвольные векторы) , чтобы найти собственные значения A . Рутисхаузер взял алгоритм Александра Эйткена для этой задачи и развил его в алгоритм фактор-разность или алгоритм qd. . Организовав вычисления в подходящей форме, он обнаружил, что алгоритм qd на самом деле представляет собой итерацию A k = L k U k (LU-разложение), A k +1 = U k L k , примененную к трехдиагональной матрице, из которой алгоритм LR следует. [9]
Один из вариантов QR-алгоритма , алгоритм Голуба-Кахана-Рейнша , начинается с преобразования общей матрицы в двухдиагональную. [10] Этот вариант QR-алгоритма для вычисления сингулярных значений был впервые описан Голубом и Каханом (1965) . В LAPACK подпрограмма DBDSQR реализует этот итерационный метод, с некоторыми изменениями , чтобы покрыть случай , когда особые значения очень малы ( Demmel & Каган 1990 ) . Вместе с первым шагом с использованием отражений Хаусхолдера и, если необходимо, QR-разложения , это формирует DGESVD harvtxt error: no target: CITEREFGolubKahan1965 (help) harv error: no target: CITEREFDemmelKahan1990 (help) программа для вычисления разложения по сингулярным числам . QR-алгоритм также может быть реализован в бесконечных измерениях с соответствующими результатами сходимости. [11] [12]
Специалистам по данным стоит хорошо знать несколько разложений матриц, потому что они помогают находить методы для актуальных вычислений и оценки результатов для моделей и алгоритмов, с которыми мы работаем. В некоторых случаях конкретной формой разложения является алгоритм (например, в методе главных компонент и сингулярном разложении). И во всех случаях разложение матриц помогает развивать интуицию и способность к анализу.
QR-разложение — одно из самых полезных. Ему находится множество важных применений в науке о данных, статистике и анализе данных. Одно из подобных применений — вычисление решения задачи наименьших квадратов.
- Повторение проблемы наименьших квадратов.
- Описание с QR-разложения.
- Решение задачи наименьших квадратов с помощью QR-разложения.
- Реализация вычисления QR-разложения на R и C++ и сравнение реализаций.
QR-разложение позволяет вычислить решение задачи наименьших квадратов. Подчеркиваю, именно вычислить, поскольку обычный метод наименьших квадратов дает нам закрытое решение в форме нормальных уравнений. Это замечательно, но, если нам нужно найти актуальное числовое решение, этот метод не подойдет.
Вспомним задачу наименьших квадратов. Нужно решить уравнение ниже:
Проблема состоит в том, что не существует решения для β, потому что обычно, если у нас больше наблюдений, чем переменных, X не имеет обратного значения, следовательно, вычисление ниже невозможно:
Вместо этого попробуем найти некоторое β̂, решающее уравнение неидеально, но с минимально возможной ошибкой. Один из способов— минимизировать следующую целевую функцию, являющуюся функцией от β̂.
Минимизация этой суммы квадратов отклонений и дает имя задаче наименьших квадратов. Взятие производных по β̂ и приравнивание к нулю приведут к нормальным уравнениям и предоставят решение в замкнутой форме.
Это один из способов. Но можно использовать линейную алгебру. И вот здесь QR-разложение подойдет как нельзя лучше.
Для начала давайте опишем это разложение. QR-разложение позволяет отобразить матрицу как произведение двух отдельных матриц Q и R.
Это означает, что:
Так как R квадратная, до тех пор, пока диагональные элементы не равны нулю, она также обратима. Если столбцы X линейно независимы, это всегда будет верным. Хотя, если в данных есть коллинеарность, все же будут возникать проблемы. Тем не менее — и в этом суть QR-разложения — прямоугольная и необратимая X может быть выражена как две обратимые матрицы! И вот это уже имеет смысл.
Теперь, зная, что из себя представляет QR-разложение, решим задачу наименьших квадратов следующим образом:
Это означает, что все, что нужно сделать — это найти матрицу, обратную R, транспонировать Q и вычислить их произведение. Мы получим коэффициенты обычного метода наименьших квадратов. Нам даже не нужно вычислять ковариационную матрицу и обратную ей, что происходит в решении обычным методом наименьших квадратов.
Чтобы найти QR-коэффициенты матрицы, сначала найдем Q, используя процесс Грама-Шмидта, затем просто умножим исходную матрицу на транспонированную Q, чтобы найти R. Далее применим QR-разложение, используя функции, внедренные в R и C++ . Позднее мы заглянем внутрь этих функций, чтобы рассмотреть весь процесс в деталях.
статьи
Процесс Грама-Шмидта
Процесс Грама-Шмидта — это метод вычисления ортогональной матрицы Q, которая состоит из ортогональных или независимых единичных векторов и занимает такое же пространство, что и матрица X.
- В качестве начального шага алгоритм включает в себя выбор вектора столбца X, скажем, x1 = u1.
- Затем находим вектор, ортогональный u1, проецируя на него следующий столбец X, скажем, x2, и вычитая из него проекцию u2 = x2 − proj u1x2. Теперь у нас есть набор из двух ортогональных векторов.
- Следующий шаг — проделать то же самое, но вычитая сумму проекций на каждый вектор из набора ортогональных векторов uk.
Выразим это следующим образом:
Получив полный набор ортогональных векторов, просто делим каждый вектор на его нормаль и помещаем их в матрицу:
Зная Q, легко вычисляем R:
Конечно, в R существуют встроенные функции, осуществляющие QR-разложение. Так как алгоритм Грама-Шмидта является итеративным по своей природе, я решил реализовать его на C++ , являющемся хорошим инструментом для подобных задач, и сравнить его с подобной функцией R . Вот как выглядит моя версия R :
Очень точно. Внутри цикла for есть цикл while, и вызываемая проекционная функция также является функцией, написанной на R .
А вот как выглядит моя версия C++ . Логика по сути та же, за исключением того, что есть другой цикл for, нормализующий ортогональные столбцы.
В дополнение к двум функциям выше у меня есть третья, идентичная R , только она называется projC , а не proj . Я назвал ее myQRC ( projC написана на C++ , а proj — на R ). В противном случае у нас есть чистая C++ функция myQRCpp и чистая R функция myQR .
Чтобы сравнить, как быстро эти три функции выполняют QR-разложение, я поместил их в функцию QR_comp , которая вызывает функции и измеряет время выполнения каждой с одним и тем же аргументом матрицы.
Их производительность можно сравнить по сетке из случайных матриц n на m . Эти матрицы генерируются при вызове функции QR_comp .
Очевидно, что чем больше задействован C++ , тем быстрее вычисление QR-разложения. Функция C++ решает его менее, чем за минуту, для матриц размером до 250 столбцов на 3000 строк или 600 столбцов на 500 . R -функция в 2–3 раза медленнее.
QR — это просто разложение матрицы, а метод наименьших квадратов просто одно из применений QR. Надеюсь, обсуждение выше демонстрирует, насколько важна и полезна линейная алгебра для науки о данных.
Многие сложные матричные операции не могут быть решены эффективно или со стабильностью, используя ограниченную точность компьютеров.
Матричные декомпозиции - это методы, которые сокращают матрицу на составные части, что облегчает вычисление более сложных матричных операций. Методы матричной декомпозиции, также называемые методами матричной факторизации, являются основой линейной алгебры в компьютерах, даже для базовых операций, таких как решение систем линейных уравнений, вычисление обратного и вычисление определителя матрицы.
В этом уроке вы узнаете о разложении матриц и о том, как их вычислять в Python.
После завершения этого урока вы узнаете:
- Что такое матричная декомпозиция и почему эти типы операций важны.
- Как рассчитать LU и QR матричные разложения в Python.
- Как рассчитать разложение матрицы Холецкого в Python.
- Обновление март / 2018: Исправлена небольшая опечатка в описании QR-разложения.
Что такое матричная декомпозиция?
Разложение матрицы - это способ разложения матрицы на составные части.
Это подход, который может упростить более сложные матричные операции, которые могут быть выполнены на разложенной матрице, а не на самой исходной матрице.
Распространенной аналогией для разложения матриц является разложение чисел, такое как разложение 10 на 2 x 5. По этой причине разложение матриц также называется разложением матриц. Подобно факторизации реальных значений, существует много способов разложения матрицы, поэтому существует целый ряд различных методов разложения матрицы.
Два простых и широко используемых метода декомпозиции матрицы - это декомпозиция матрицы LU и декомпозиция матрицы QR.
Далее мы подробнее рассмотрим каждый из этих методов.
Разложение QR-матрицы
QR-разложение предназначено для m x n матриц (не ограничено квадратными матрицами) и разбивает матрицу на Q и R компоненты.
Или без точечной записи.
Где A - матрица, которую мы хотим разложить, Q - матрица с размером m x m, а R - верхняя треугольная матрица с размером m x n.
QR-разложение находится с использованием итерационного численного метода, который может дать сбой для тех матриц, которые невозможно разложить или легко разложить.
Как и LU-разложение, QR-разложение часто используется для решения систем линейных уравнений, хотя не ограничивается квадратными матрицами.
QR-разложение может быть реализовано в NumPy с помощью функции qr (). По умолчанию функция возвращает матрицы Q и R с меньшими или «уменьшенными» размерами, что является более экономичным. Мы можем изменить это, чтобы вернуть ожидаемые размеры m x m для Q и m x n для R, указав аргумент mode как «complete», хотя это не требуется для большинства приложений.
В приведенном ниже примере определяется матрица 3 × 2, вычисляется QR-разложение, а затем восстанавливается исходная матрица из разложенных элементов.
При выполнении примера сначала печатается определенная матрица 3 × 2, затем элементы Q и R, а затем, наконец, восстановленная матрица, которая соответствует тому, с чего мы начали.
Читайте также: