이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

qr

설명

예제

R = qr(A)QR 분해 A = Q*R의 R 부분을 반환합니다. 여기서 A는 mxn 행렬이고 R은 mxn 상부 삼각 행렬이고 Q는 mxm 유니타리 행렬입니다.

예제

[Q,R] = qr(A)A = Q*R이 되는 상부 삼각 행렬 R과 유니타리 행렬 Q를 반환합니다.

예제

[Q,R,P] = qr(A)A*P = Q*R이 되는 상부 삼각 행렬 R, 유니타리 행렬 Q, 치환 행렬 P를 반환합니다. A의 모든 요소가 부동소수점 숫자로 근사될 수 있다면 이 구문은 abs(diag(R))이 감소하도록 열 치환 P를 선택합니다. 그렇지 않은 경우 P = eye(n)을 반환합니다.

예제

[C,R] = qr(A,B)C = Q'*BA = Q*R이 되는 상부 삼각 행렬 R과 행렬 C를 반환합니다. 여기서 AB의 행 개수는 동일해야 합니다.

CR은 행렬 방정식 A*X = B의 해를 X = R\C로 나타냅니다.

예제

[C,R,P] = qr(A,B)는 상부 삼각 행렬 R, C = Q'*B가 되는 행렬 C, A*P = Q*R이 되는 치환 행렬 P를 반환합니다. A의 모든 요소가 부동소수점 숫자로 근사될 수 있다면 이 구문은 abs(diag(R))이 감소하도록 치환 행렬 P를 선택합니다. 그렇지 않은 경우 P = eye(n)을 반환합니다. 여기서 AB의 행 개수는 동일해야 합니다.

C, R, P는 행렬 방정식 A*X = B의 해를 X = P*(R\C)로 나타냅니다.

예제

[Q,R,p] = qr(A,'vector')는 치환 정보를 A(:,p) = Q*R이 되는 벡터 p로 반환합니다.

예제

[C,R,p] = qr(A,B,'vector')는 치환 정보를 벡터 p로 반환합니다.

C, R, p는 행렬 방정식 A*X = B의 해를 X(p,:) = R\C로 나타냅니다.

예제

___ = qr(___,'econ')은 "효율적인 크기"의 분해를 반환합니다. Am > nmxn 행렬인 경우 qrQ의 처음 n개 열과 R의 처음 n개 행만 계산합니다. m <= n인 경우, 'econ'을 포함하는 구문은 'econ'이 없는 구문에 상응합니다.

'econ'을 사용하면 qr은 치환 정보를 항상 벡터 p로 반환합니다.

'econ' 대신 0을 사용할 수 있습니다. 예를 들어, [Q,R] = qr(A,0)[Q,R] = qr(A,'econ')과 동일합니다.

예제

___ = qr(___,'real')은 입력 인수와 중간 결과가 실수라고 가정하며, 그에 따라 absconj에 대한 호출을 차단합니다. 이 플래그를 사용하면 qr은 모든 기호 변수가 실수를 나타낸다고 가정합니다. 이 플래그를 사용할 때는 모든 숫자형 인수가 실수인지 확인하십시오.

결과가 켤레 복소수로 나오는 것을 방지하려면 'real'을 사용하십시오.

예제

QR 분해의 R 부분

4x4 윌킨슨 고유값 테스트 행렬의 QR 분해의 R 부분을 계산합니다.

4x4 윌킨슨 고유값 테스트 행렬을 만듭니다.

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]

출력 인수가 하나인 구문을 사용하여 QR 분해의 Q 부분을 반환하지 않고 R 부분을 반환합니다.

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 분해

3x3 파스칼 행렬의 QR 분해를 계산합니다.

3x3 파스칼 행렬을 만듭니다.

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

A의 QR 분해를 나타내는 Q 행렬과 R 행렬을 구합니다.

[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]

isAlways를 사용하여 A = Q*R인지 확인합니다.

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

치환 정보

치환을 사용하면 부동소수점 행렬에 대한 QR 분해의 수치적 안정성을 높이는 데 도움이 됩니다. qr 함수는 치환 정보를 행렬 또는 벡터로 반환합니다.

가변 정밀도 연산방식에 사용되는 유효 소숫점 자릿수를 10으로 설정합니다. 부동소수점 숫자로 3x3 기호 힐베르트 행렬을 근사합니다.

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]

먼저 치환 없이 A의 QR 분해를 계산합니다.

[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]

AQ*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 분해의 수치적 안정성을 높이려면 출력 인수 3개를 갖는 구문을 지정하여 치환을 사용하십시오. 기호 변수, 표현식 또는 함수를 포함하지 않는 행렬의 경우, 이 구문은 반환되는 행렬 Rabs(diag(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를 풀어야 한다고 가정하겠습니다. 여기서 Ab는 다음과 같은 행렬과 벡터입니다.

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 = Q'*BA = Q*R이 되는 행렬 CR을 구합니다.

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

X를 계산합니다.

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

isAlways를 사용하여 X가 시스템 A*X = b의 해인지 확인합니다.

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

치환 정보를 갖는 QR 분해를 사용하여 행렬 방정식 풀기

부동소수점 숫자를 포함하는 연립방정식을 풀 때는 치환 행렬 또는 벡터를 갖는 QR 분해를 사용하십시오.

연립방정식 A*X = b를 풀어야 한다고 가정하겠습니다. 여기서 Ab는 다음과 같은 행렬과 벡터입니다.

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

qr을 사용하여 C = Q'*BA = Q*R이 되는 행렬 CR을 구합니다.

[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 분해를 계산합니다.

4x4 파스칼 행렬의 처음 2개 열로 구성된 행렬을 만듭니다.

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 분해를 계산합니다. 행 개수가 열 개수보다 크므로 qrQ의 처음 2개 열과 R의 처음 2개 행만 계산합니다.

[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 분해를 계산합니다. 기본적으로 qrx가 복소수를 나타낸다고 가정하므로 결과는 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)]

입력 인수

모두 축소

입력 행렬로, mxn 기호 행렬로 지정됩니다.

입력값으로, 기호 벡터 또는 기호 행렬로 지정됩니다. B의 행 개수는 A의 행 개수와 같아야 합니다.

출력 인수

모두 축소

QR 분해의 R 부분으로, mxn 상부 삼각 기호 행렬로 반환됩니다.

QR 분해의 Q 부분으로, mxm 유니타리 기호 행렬로 반환됩니다.

치환 정보로, A*P = Q*R이 되는 배정밀도 값으로 구성된 행렬로 반환됩니다.

치환 정보로, A(:,p) = Q*R이 되는 배정밀도 값으로 구성된 벡터로 반환됩니다.

행렬 방정식 A*X = B의 해를 나타내는 행렬로, C = Q'*B가 되는 기호 행렬로 반환됩니다.

세부 정보

모두 축소

행렬의 QR 분해

QR 분해는 mxn 행렬 AA = Q*R로 표현합니다. 여기서 Qmxm 유니타리 행렬이고 Rmxn 상부 삼각 행렬입니다. A의 성분이 실수이면 Q는 직교 행렬입니다.

  • 상부 삼각 행렬 R은 조건 R = chol(A'*A)를 충족합니다.

  • 인수 'econ'0은 반환된 행렬의 형태에만 영향을 줍니다.

  • 기호 객체가 아닌 숫자형 행렬(sym, syms 또는 vpa로 만들지 않은 행렬)에 대해 qr을 호출하면 MATLAB® qr 함수가 호출됩니다.

  • 'vector' 대신 'matrix'를 사용하면 기본적으로 qr은 치환 행렬을 반환합니다. 'matrix''econ'을 사용하면 qr은 오류를 발생시킵니다.

  • 기호 변수를 많이 사용한 행렬 계산은 속도가 느릴 수 있습니다. 계산 속도를 높이려면 일부 변수에 주어진 값을 대입하여 기호 변수의 수를 줄이십시오.

참고 항목

| | |

R2014a에 개발됨