qr

Описание

пример

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') возвращает разложение «economic size». Если 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 является ортогональной матрицей.

Совет

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

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

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

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

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

См. также

| | |

Введенный в R2014a