qr

Синтаксис

R = qr(A)
[Q,R] = qr(A)
[Q,R,P] = qr(A)
[C,R] = qr(A,B)
[C,R,P] = qr(A,B)
[Q,R,p] = qr(A,'vector')
[C,R,p] = qr(A,B,'vector')
___ = qr(___,'econ')
___ = qr(___,'real')

Описание

пример

R = qr(A) возвращает часть R разложения QR A = Q*R. Здесь, A является m-by-n матрица, R является m-by-n верхняя треугольная матрица, и Q является m-by-m унитарная матрица.

пример

[Q,R] = qr(A) возвращает верхнюю треугольную матрицу R и унитарная матрица Q, такой что A = Q*R.

пример

[Q,R,P] = qr(A) возвращает верхнюю треугольную матрицу R, унитарная матрица Q и матрица перестановок P, такой что A*P = Q*R. Если все элементы A могут быть аппроксимированы числами с плавающей запятой, то этот синтаксис выбирает перестановку столбца P так, чтобы abs(diag(R)) уменьшился. В противном случае это возвращает P = eye(n).

пример

[C,R] = qr(A,B) возвращает верхнюю треугольную матрицу R и матричный C, такой что C = Q'*B и A = Q*R. Здесь, A и B должны иметь одинаковое число строк.

C и R представляют решение матричного уравнения A*X = B как X = R\C.

пример

[C,R,P] = qr(A,B) возвращает верхнюю треугольную матрицу R, матричный C, такой что C = Q'*B и матрица перестановок P, такой что A*P = Q*R. Если все элементы A могут быть аппроксимированы числами с плавающей запятой, то этот синтаксис выбирает матрицу перестановок P так, чтобы abs(diag(R)) уменьшился. В противном случае это возвращает P = eye(n). Здесь, A и B должны иметь одинаковое число строк.

C, R и P представляют решение матричного уравнения A*X = B как X = P*(R\C).

пример

[Q,R,p] = qr(A,'vector') возвращает информацию о перестановке как векторный p, такой что A(:,p) = Q*R.

пример

[C,R,p] = qr(A,B,'vector') возвращает информацию о перестановке как векторный p.

C, R и p представляют решение матричного уравнения A*X = B как X(p,:) = R\C.

пример

___ = qr(___,'econ') возвращает "разложение" размера экономики. Если A является m-by-n матрица с m > n, то qr вычисляет только первые столбцы n Q и первые строки n R. Для m <= n синтаксисы с 'econ' эквивалентны соответствующим синтаксисам без 'econ'.

Когда вы используете 'econ', qr всегда возвращает информацию о перестановке как векторный p.

Можно использовать 0 вместо 'econ'. Например, [Q,R] = qr(A,0) эквивалентен [Q,R] = qr(A,'econ').

пример

___ = qr(___,'real') принимает, что входные параметры и промежуточные результаты действительны, и поэтому, подавляет вызовы abs и conj. Когда вы используете этот флаг, qr принимает, что все символьные переменные представляют вещественные числа. При использовании этого флага гарантируйте, что все числовые аргументы являются вещественными числами.

Используйте 'real', чтобы избежать сопряженных комплексных чисел в результате.

Примеры

R часть QR-факторизации

Вычислите часть R разложения QR 4-by-4 тестовая матрица собственного значения Уилкинсона.

Создайте 4-by-4 тестовая матрица собственного значения Уилкинсона:

A = sym(wilkinson(4))
A =
[ 3/2,   1,   0,   0]
[   1, 1/2,   1,   0]
[   0,   1, 1/2,   1]
[   0,   0,   1, 3/2]

Используйте синтаксис с одним выходным аргументом, чтобы возвратить часть R разложения QR, не возвращая часть Q:

R = qr(A)
R =
[ 13^(1/2)/2,        (4*13^(1/2))/13,            (2*13^(1/2))/13,                              0]
[          0, (13^(1/2)*53^(1/2))/26, (10*13^(1/2)*53^(1/2))/689,       (2*13^(1/2)*53^(1/2))/53]
[          0,                      0,   (53^(1/2)*381^(1/2))/106, (172*53^(1/2)*381^(1/2))/20193]
[          0,                      0,                          0,             (35*381^(1/2))/762]

QR-факторизация матрицы Паскаля

Вычислите разложение QR 3-by-3 матрица Паскаля.

Создайте 3-by-3 матрица Паскаля:

A = sym(pascal(3))
A =
[ 1, 1, 1]
[ 1, 2, 3]
[ 1, 3, 6]

Найдите Q и матрицы R, представляющие разложение QR A:

[Q,R] = qr(A)
Q =
[ 3^(1/2)/3, -2^(1/2)/2,  6^(1/2)/6]
[ 3^(1/2)/3,          0, -6^(1/2)/3]
[ 3^(1/2)/3,  2^(1/2)/2,  6^(1/2)/6]
 
R =
[ 3^(1/2), 2*3^(1/2), (10*3^(1/2))/3]
[       0,   2^(1/2),  (5*2^(1/2))/2]
[       0,         0,      6^(1/2)/6]

Проверьте что A = Q*R с помощью isAlways:

isAlways(A == Q*R)
ans =
  3×3 logical array
     1     1     1
     1     1     1
     1     1     1

Информация о перестановке

Используя перестановки помогает увеличить числовую устойчивость QR-факторизации для матриц с плавающей точкой. Функция qr возвращает информацию о перестановке или как матрицу или как вектор.

Определите номер значительных десятичных цифр, используемых для арифметики переменной точности, к 10. Аппроксимируйте 3-by-3 символьная Гильбертова матрица числами с плавающей запятой:

previoussetting = digits(10);
A = vpa(hilb(3))
A =
[          1.0,          0.5, 0.3333333333]
[          0.5, 0.3333333333,         0.25]
[ 0.3333333333,         0.25,          0.2]

Во-первых, вычислите разложение QR A без перестановок:

[Q,R] = qr(A)
Q =
[ 0.8571428571, -0.5016049166,  0.1170411472]
[ 0.4285714286,  0.5684855721, -0.7022468832]
[ 0.2857142857,  0.6520863915,  0.7022468832]
 
R =
[ 1.166666667, 0.6428571429,           0.45]
[           0, 0.1017143303,   0.1053370325]
[           0,            0, 0.003901371573]

Вычислите различие между A и Q*R. Вычисленный Q и матрицы R строго не удовлетворяют равенство A*P = Q*R из-за ошибок округления.

A - Q*R
ans =
[ -1.387778781e-16, -3.989863995e-16, -2.064320936e-16]
[ -3.469446952e-18, -8.847089727e-17, -1.084202172e-16]
[ -2.602085214e-18, -6.591949209e-17, -6.678685383e-17]

Чтобы увеличить числовую устойчивость разложения QR, используйте перестановки путем определения синтаксиса с тремя выходными аргументами. Для матриц, которые не содержат символьные переменные, выражения или функции, этот синтаксис инициировал поворот, так, чтобы abs(diag(R)) в возвращенном матричном R уменьшился.

[Q,R,P] = qr(A)
Q =
[ 0.8571428571, -0.4969293466, -0.1355261854]
[ 0.4285714286,  0.5421047417,  0.7228063223]
[ 0.2857142857,  0.6776309272, -0.6776309272]
R =
[ 1.166666667,         0.45,   0.6428571429]
[           0, 0.1054092553,   0.1016446391]
[           0,            0, 0.003764616262]
P =
     1     0     0
     0     0     1
     0     1     0

Проверяйте равенство A*P = Q*R снова. QR-факторизация с перестановками приводит к меньшим ошибкам округления.

A*P - Q*R
ans =
[ -3.469446952e-18, -4.33680869e-18, -6.938893904e-18]
[                0, -8.67361738e-19, -1.734723476e-18]
[                0, -4.33680869e-19, -1.734723476e-18]

Теперь, возвратите информацию о перестановке как вектор при помощи аргумента 'vector':

[Q,R,p] = qr(A,'vector')
Q =
[ 0.8571428571, -0.4969293466, -0.1355261854]
[ 0.4285714286,  0.5421047417,  0.7228063223]
[ 0.2857142857,  0.6776309272, -0.6776309272]
R =
[ 1.166666667,         0.45,   0.6428571429]
[           0, 0.1054092553,   0.1016446391]
[           0,            0, 0.003764616262]
p =
     1     3     2

Проверьте что A(:,p) = Q*R:

A(:,p) - Q*R
ans =
[ -3.469446952e-18, -4.33680869e-18, -6.938893904e-18]
[                0, -8.67361738e-19, -1.734723476e-18]
[                0, -4.33680869e-19, -1.734723476e-18]

Точные символьные вычисления позволяют вам избежать ошибок округления:

A = sym(hilb(3));
[Q,R] = qr(A);
A - Q*R
ans =
[ 0, 0, 0]
[ 0, 0, 0]
[ 0, 0, 0]

Восстановите количество значительных десятичных цифр к его настройке по умолчанию:

digits(previoussetting)

Используйте разложение QR, чтобы решить матричное уравнение

Можно использовать qr, чтобы решить системы уравнений в матричной форме.

Предположим, что необходимо решить систему уравнений A*X = b, где A и b являются следующей матрицей и вектором:

A = sym(invhilb(5))
b = sym([1:5]')
A =
[    25,   -300,    1050,   -1400,    630]
[  -300,   4800,  -18900,   26880, -12600]
[  1050, -18900,   79380, -117600,  56700]
[ -1400,  26880, -117600,  179200, -88200]
[   630, -12600,   56700,  -88200,  44100]
b =
 
 1
 2
 3
 4
 5

Используйте qr, чтобы найти матрицы C и R, таким что C = Q'*B и A = Q*R:

[C,R] = qr(A,b);

Вычислите решение X:

X = R\C
X =
        5
    71/20
   197/70
  657/280
 1271/630

Проверьте, что X является решением системы A*X = b с помощью isAlways:

isAlways(A*X == b)
ans =
  5×1 logical array
     1
     1
     1
     1
     1

Используйте разложение QR с информацией о перестановке, чтобы решить матричное уравнение

При решении систем уравнений, которые содержат числа с плавающей запятой, разложение QR с матрицей перестановок или вектором.

Предположим, что необходимо решить систему уравнений A*X = b, где A и b являются следующей матрицей и вектором:

previoussetting = digits(10);
A = vpa([2 -3 -1; 1 1 -1; 0 1 -1]);
b = vpa([2; 0; -1]);

Используйте qr, чтобы найти матрицы C и R, таким что C = Q'*B и A = Q*R:

[C,R,P] = qr(A,b)
C =
  -2.110579412
 -0.2132007164
  0.7071067812
R =
[ 3.31662479, 0.3015113446, -1.507556723]
[          0,  1.705605731, -1.492405014]
[          0,            0, 0.7071067812]
P =
     0     0     1
     1     0     0
     0     1     0

Вычислите решение X:

X = P*(R\C)
X =
   1.0
 -0.25
  0.75

Также возвратите информацию о перестановке как вектор:

[C,R,p] = qr(A,b,'vector')
C =
  -2.110579412
 -0.2132007164
  0.7071067812
R =
[ 3.31662479, 0.3015113446, -1.507556723]
[          0,  1.705605731, -1.492405014]
[          0,            0, 0.7071067812]
p =
     2     3     1

В этом случае вычислите решение X можно следующим образом:

X(p,:) = R\C
X =
   1.0
 -0.25
  0.75

Восстановите количество значительных десятичных цифр к его настройке по умолчанию:

digits(previoussetting)

Разложение размера экономики

Используйте 'econ', чтобы вычислить “размер экономики” разложение QR.

Создайте матрицу, которая состоит из первых двух столбцов 4-by-4 матрица Паскаля:

A = sym(pascal(4));
A = A(:,1:2)
A =
[ 1, 1]
[ 1, 2]
[ 1, 3]
[ 1, 4]

Вычислите разложение QR для этой матрицы:

[Q,R] = qr(A)
Q =
[ 1/2, -(3*5^(1/2))/10,    (3^(1/2)*10^(1/2))/10,          0]
[ 1/2,     -5^(1/2)/10, -(2*3^(1/2)*10^(1/2))/15,  6^(1/2)/6]
[ 1/2,      5^(1/2)/10,   -(3^(1/2)*10^(1/2))/30, -6^(1/2)/3]
[ 1/2,  (3*5^(1/2))/10,    (3^(1/2)*10^(1/2))/15,  6^(1/2)/6]
 
R =
[ 2,       5]
[ 0, 5^(1/2)]
[ 0,       0]
[ 0,       0]

Теперь, вычислите “размер экономики” разложение QR для этой матрицы. Поскольку количество строк превышает количество столбцов, qr вычисляет только первые столбцы 2 Q и первые строки 2 R.

[Q,R] = qr(A,'econ')
Q =
[ 1/2, -(3*5^(1/2))/10]
[ 1/2,     -5^(1/2)/10]
[ 1/2,      5^(1/2)/10]
[ 1/2,  (3*5^(1/2))/10]
 
R =
[ 2,       5]
[ 0, 5^(1/2)]

Избегайте сопряженных комплексных чисел

Используйте флаг 'real', чтобы избежать сопряженных комплексных чисел в результате.

Создайте матрицу, один из элементов, из которых переменная:

syms x
A = [1 2; 3 x]
A =
[ 1, 2]
[ 3, x]

Вычислите QR-факторизацию этой матрицы. По умолчанию qr принимает, что x представляет комплексное число, и поэтому, результат содержит выражения с функцией abs.

[Q,R] = qr(A)
Q =
[     10^(1/2)/10, -((3*x)/10 - 9/5)/(abs(x/10 - 3/5)^2...
                          + abs((3*x)/10 - 9/5)^2)^(1/2)]
[ (3*10^(1/2))/10,      (x/10 - 3/5)/(abs(x/10 - 3/5)^2...
                          + abs((3*x)/10 - 9/5)^2)^(1/2)]
 
R =
[ 10^(1/2),                           (10^(1/2)*(3*x + 2))/10]
[        0, (abs(x/10 - 3/5)^2 + abs((3*x)/10 - 9/5)^2)^(1/2)]

Когда вы используете 'real', qr принимает, что все символьные переменные представляют вещественные числа и могут возвратить более короткие результаты:

[Q,R] = qr(A,'real')
Q =
[     10^(1/2)/10, -((3*x)/10 - 9/5)/(x^2/10 - (6*x)/5...
                                          + 18/5)^(1/2)]
[ (3*10^(1/2))/10,      (x/10 - 3/5)/(x^2/10 - (6*x)/5...
                                          + 18/5)^(1/2)]
 
R =
[ 10^(1/2),         (10^(1/2)*(3*x + 2))/10]
[        0, (x^2/10 - (6*x)/5 + 18/5)^(1/2)]

Входные параметры

свернуть все

Введите матрицу, заданную как m-by-n символьная матрица.

Введите, заданный как символьный вектор или матрица. Количество строк в B должно совпасть с количеством строк в A.

Выходные аргументы

свернуть все

R часть разложения QR, возвращенного как m-by-n верхняя треугольная символьная матрица.

Q часть разложения QR, возвращенного как m-by-m унитарная символьная матрица.

Информация о перестановке, возвращенная как матрица значений с двойной точностью, таких, что A*P = Q*R.

Информация о перестановке, возвращенная как вектор значений с двойной точностью, таких, что A(:,p) = Q*R.

Матричное решение для представления матричного уравнения A*X = B, возвращенный как символьная матрица, такая, что C = Q'*B.

Больше о

свернуть все

QR-факторизация матрицы

QR-факторизация выражает m-by-n матричный A как A = Q*R. Здесь, Q является m-by-m унитарная матрица, и R является m-by-n верхняя треугольная матрица. Если компоненты A являются вещественными числами, то Q является ортогональной матрицей.

Советы

  • Верхняя треугольная матрица A удовлетворяет следующее условие: R = chol(A'*A).

  • Аргументы 'econ' и 0 только влияют на форму возвращенных матриц.

  • Вызывание qr для числовых матриц, которые не являются символьными объектами (не созданный sym, syms или vpa) вызывает функцию MATLAB® qr.

  • Если вы используете 'matrix' вместо 'vector', то qr возвращает матрицы перестановки, как это делает по умолчанию. Если вы используете 'matrix' и 'econ', то qr выдает ошибку.

  • Матричные вычисления, включающие много символьных переменных, могут быть медленными. Чтобы увеличить вычислительную скорость, сократите количество символьных переменных путем заменения данными значениями некоторые переменные.

Смотрите также

| | |

Введенный в R2014a