Main Content

qr

기호 행렬의 QR 분해

설명

예제

R = qr(A)QR 분해 A = Q*RR 인수를 반환합니다. 여기서 A는 m×n 기호 행렬이고 R은 m×n 상부 삼각 기호 행렬이고 Q는 m×m 유니타리 기호 행렬입니다.

예제

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

예제

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

예제

[___] = qr(A,"econ")은 이전 출력 인수 조합 중 하나를 사용하여 효율적인 크기의 분해를 반환합니다. 출력값의 크기는 m×n 행렬 A의 크기에 따라 달라집니다.

  • m > n인 경우 qrQ의 처음 n개 열과 R의 처음 n개 행만 계산합니다.

  • m ≤ n인 경우 효율적인 크기의 분해는 "econ" 옵션이 없는 QR 분해와 같습니다.

"econ"을 사용하면 기본적으로 qr이 치환 정보를 행렬 P로 반환합니다.

예제

[Q,R,P] = qr(___,outputForm)은 치환 정보 P를 행렬로 반환할지 또는 벡터로 반환할지 지정합니다. 예를 들어 outputForm"vector"인 경우 A(:,P) = Q*R입니다. outputForm의 디폴트 값은 A*P = Q*R이 되는 "matrix"입니다.

[___] = qr(A,0)qr(A,"econ","vector")와 동일합니다. 이 구문은 권장되지 않습니다. "econ" 옵션을 대신 사용하십시오.

예제

[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)A*P = Q*R이 되는 치환 행렬 P도 반환합니다. A의 모든 요소가 부동소수점 숫자로 근사될 수 있다면 이 구문은 abs(diag(R))이 감소하도록 치환 행렬 P를 선택합니다. 그렇지 않은 경우 P = eye(n)을 반환합니다.

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

[___] = qr(A,B,"econ")은 이전 출력 인수 조합 중 하나를 사용하여 효율적인 크기의 분해를 반환합니다. 출력값의 크기는 m×n 행렬 A의 크기에 따라 달라집니다.

  • m > n인 경우 qrCR의 처음 n개 행만 계산합니다.

  • m ≤ n인 경우 효율적인 크기의 분해는 "econ" 옵션이 없는 QR 분해와 같습니다.

"econ"을 사용하면 기본적으로 qr이 치환 정보를 행렬 P로 반환합니다.

예제

[C,R,P] = qr(___,outputForm)은 치환 정보 P를 행렬로 반환할지 또는 벡터로 반환할지 지정합니다. 예를 들어, outputForm"vector"인 경우 행렬 방정식 A*X = B의 해는 X(P,:) = R\C입니다. outputForm의 디폴트 값은 A*X = B의 해가 X = P*(R\C)가 되는 "matrix"입니다.

[___] = qr(A,B,0)qr(A,B,"econ","vector")와 동일합니다. 이 구문은 권장되지 않습니다. "econ" 옵션을 대신 사용하십시오.

예제

___ = qr(___,"real")은 입력 인수와 중간 결과가 실수라고 가정하며, 그에 따라 absconj에 대한 호출을 차단합니다. 이 옵션을 사용하면 qr은 모든 기호 변수가 실수를 나타낸다고 가정합니다. 이 구문에서는 모든 숫자 인수가 실수여야 합니다.

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

예제

모두 축소

4×4 윌킨슨 고유값 테스트 행렬의 QR 분해의 상부 삼각 R 인수를 계산합니다.

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

A = sym(wilkinson(4))
A = 

(32100112100112100132)

Q 인수를 반환하지 않고 QR 분해의 R 인수를 반환합니다.

R = qr(A)
R = 

(13241313213130013532610135368921353530053381106172533812019300035381762)

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

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

A = sym(pascal(3))
A = 

(111123136)

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

[Q,R] = qr(A)
Q = 

(33-2266330-63332266)

R = 

(3231033025220066)

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

TF = isAlways(A == Q*R)
TF = 3x3 logical array

   1   1   1
   1   1   1
   1   1   1

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

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

previoussetting = digits(10);
A = vpa(hilb(3))
A = 

(1.00.50.33333333330.50.33333333330.250.33333333330.250.2)

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

[Q,R] = qr(A)
Q = 

(0.8571428571-0.50160491660.11704114720.42857142860.5684855721-0.70224688320.28571428570.65208639150.7022468832)

R = 

(1.1666666670.64285714290.4500.10171433030.1053370325000.003901371573)

AQ*R 사이의 차이를 계산합니다. 위에서 구한 Q 행렬과 R 행렬은 반올림 오차 때문에 등식 A = Q*R을 엄밀히 충족하지 않습니다.

E = A - Q*R
E = 

(-3.469446952e-18-6.938893904e-18-4.33680869e-180-1.734723476e-18-8.67361738e-190-8.67361738e-19-4.33680869e-19)

QR 분해의 수치적 안정성을 높이려면 출력 인수 3개를 갖는 구문을 지정하여 치환을 사용하십시오. 기호 변수, 표현식 또는 함수를 포함하지 않는 행렬의 경우, 이 구문은 반환되는 행렬 Rabs(diag(R))이 감소하도록 피벗 연산을 트리거합니다.

[Q,R,P] = qr(A)
Q = 

(0.8571428571-0.4969293466-0.13552618540.42857142860.54210474170.72280632230.28571428570.6776309272-0.6776309272)

R = 

(1.1666666670.450.642857142900.10540925530.1016446391000.003764616262)

P = 3×3

     1     0     0
     0     0     1
     0     1     0

등식 A*P = Q*R을 확인합니다. 치환을 사용한 QR 분해의 결과로 반올림 오차가 줄어듭니다.

E = A*P - Q*R
E = 

(-3.469446952e-18-4.33680869e-18-6.938893904e-180-8.67361738e-19-1.734723476e-180-4.33680869e-19-1.734723476e-18)

이번에는 "vector" 인수를 사용하여 치환 정보를 벡터로 반환합니다.

[Q,R,p] = qr(A,"vector")
Q = 

(0.8571428571-0.4969293466-0.13552618540.42857142860.54210474170.72280632230.28571428570.6776309272-0.6776309272)

R = 

(1.1666666670.450.642857142900.10540925530.1016446391000.003764616262)

p = 1×3

     1     3     2

A(:,p) = Q*R인지 확인합니다.

E = A(:,p) - Q*R
E = 

(-3.469446952e-18-4.33680869e-18-6.938893904e-180-8.67361738e-19-1.734723476e-180-4.33680869e-19-1.734723476e-18)

기호 계산이 정확하면 반올림 오차가 발생하지 않습니다.

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

(000000000)

유효 소수점 자릿수를 이전 설정으로 복원합니다.

digits(previoussetting)

qr을 사용하여 행렬 형식의 연립방정식을 풀 수 있습니다.

연립방정식 A*X = b를 풉니다. 여기서 A는 5×5 기호 행렬이고 b는 5×1 기호 벡터입니다.

A = sym(invhilb(5))
A = 

(25-3001050-1400630-3004800-1890026880-126001050-1890079380-11760056700-140026880-117600179200-88200630-1260056700-8820044100)

b = sym([1:5]')
b = 

(12345)

C = Q'*bA = Q*R이 되는 행렬 CR을 구합니다.

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

X를 계산합니다.

X = R\C
X = 

(57120197706572801271630)

isAlways를 사용하여 X가 연립방정식 A*X = b의 해인지 확인합니다.

tf = isAlways(A*X == b)
tf = 5x1 logical array

   1
   1
   1
   1
   1

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

연립방정식 A*X = b를 풉니다. 여기서 A는 가변 정밀도가 있는 3×3 기호 행렬이고 b는 가변 정밀도가 있는 3×1 기호 벡터입니다. C = Q'*bA = Q*R이 되는 행렬 CR을 구합니다.

previoussetting = digits(10);
A = vpa([2 -3 -1; 1 1 -1; 0 1 -1]);
b = vpa([2; 0; -1]);
[C,R,P] = qr(A,b)
C = 

(-2.110579412-0.21320071640.7071067812)

R = 

(3.316624790.3015113446-1.50755672301.705605731-1.492405014000.7071067812)

P = 3×3

     0     0     1
     1     0     0
     0     1     0

X를 계산합니다.

X = P*(R\C)
X = 

(1.0-0.250.75)

또는 치환 정보를 벡터로 반환합니다.

[C,R,p] = qr(A,b,"vector")
C = 

(-2.110579412-0.21320071640.7071067812)

R = 

(3.316624790.3015113446-1.50755672301.705605731-1.492405014000.7071067812)

p = 1×3

     2     3     1

치환 벡터 p로 해 X를 계산합니다.

X(p,:) = R\C
X = 

(1.0-0.250.75)

유효 소수점 자릿수를 이전 설정으로 복원합니다.

digits(previoussetting)

"econ" 옵션을 사용하여 효율적인 크기의 QR 분해를 계산합니다.

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

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

(11121314)

이 행렬의 QR 분해를 계산합니다.

[Q,R] = qr(A)
Q = 

(12-σ131010012-510-2310156612510-31030-6312σ13101566)where  σ1=3510

R = 

(25050000)

이제 이 행렬의 효율적인 크기의 QR 분해를 계산합니다. A의 행 개수가 열 개수보다 크므로 qrQ의 처음 2개 열과 R의 처음 2개 행만 계산합니다.

[Q,R] = qr(A,"econ")
Q = 

(12-351012-51012510123510)

R = 

(2505)

"real" 옵션을 사용하면 QR 분해 결과가 켤레 복소수로 나오는 것을 방지할 수 있습니다.

요소가 기호 변수인 행렬을 만듭니다.

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

(123x)

이 행렬의 QR 분해를 계산합니다. 기본적으로 qrx가 복소수를 나타낸다고 가정하므로 결과는 abs 함수를 사용하는 표현식을 포함합니다.

[Q,R] = qr(A)
Q = 

(1010-3x10-95σ131010x10-35σ1)where  σ1=|x10-35|2+|3x10-95|2

R = 

(10103x+2100|x10-35|2+|3x10-95|2)

"real" 옵션을 사용하면 qr은 모든 기호 변수가 실수를 나타낸다고 가정하므로 보다 짧은 결과를 반환할 수 있습니다.

[Q,R] = qr(A,"real")
Q = 

(1010-3x10-95x210-6x5+18531010x10-35x210-6x5+185)

R = 

(10103x+2100x210-6x5+185)

입력 인수

모두 축소

기호 입력값으로, m×n 기호 행렬로 지정됩니다.

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

치환 출력값의 형태로, "matrix" 또는 "vector"로 지정됩니다. 이 옵션은 치환 출력값 P가 치환 행렬 또는 벡터 중 무엇으로 반환될지를 제어합니다. 이 옵션을 사용하려면 세 개의 출력 인수를 qr에 지정해야 합니다.

  • outputForm"matrix"이면 PA*P = Q*R을 충족하는 치환 행렬입니다.

  • outputForm"vector"이면 PA(:,P) = Q*R을 충족하는 치환 벡터입니다.

출력 인수

모두 축소

QR 분해의 R 인수로, m×n 행렬 A에 대해 A = Q*R을 충족하는 상부 삼각 기호 행렬로 반환됩니다.

QR 분해의 Q 인수로, m×n 행렬 A에 대해 A = Q*R을 충족하는 유니타리 기호 행렬로 반환됩니다.

  • 완전 분해의 경우, qr(A)Q를 m×m 유니타리 기호 행렬로 반환합니다.

  • m > n인 사각 행렬 A의 경우 효율적인 크기의 분해 qr(A,"econ")Q의 처음 n개 열과 R의 처음 n개 행만 계산합니다.

치환 정보로, 배정밀도 값으로 구성된 행렬 또는 벡터로 반환됩니다. P의 형태는 outputForm의 값에 따라 달라집니다.

선형 시스템 인수로, C = Q'*BX = R\C가 되는 행렬 방정식 A*X = B의 해를 나타내는 기호 행렬로 반환됩니다. 치환 출력값 P를 지정하면 outputForm"matrix"일 때는 해가 X = P*(R\C)가 되고, outputForm"vector"일 때는 해가 X(P,:) = R\C가 됩니다.

세부 정보

모두 축소

행렬의 QR 분해

QR 분해는 m×n 행렬 AA = Q*R로 표현합니다. 완전 분해의 경우, Q는 m×m 유니타리 행렬이고 R은 m×n 상부 삼각 행렬입니다. A의 성분이 실수이면 Q는 직교 행렬입니다.

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

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

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

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

버전 내역

R2014a에 개발됨

모두 확장

참고 항목

| | |