주요 콘텐츠

qr

R2026b

기호 행렬의 QR 분해

설명

R = qr(A)는 QR 분해 A = Q*R의 R 인수를 반환합니다. 여기서 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인 경우 qr은 Q의 처음 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'*B 및 A = Q*R이 되는 상부 삼각 행렬 R과 행렬 C를 반환합니다. 여기서 A와 B의 행 개수는 동일해야 합니다.

C와 R은 행렬 방정식 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인 경우 qr은 C와 R의 처음 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")은 입력 인수와 중간 결과가 실수라고 가정하며, 그에 따라 abs와 conj에 대한 호출을 차단합니다. 이 옵션을 사용하면 qr은 모든 기호 변수가 실수를 나타낸다고 가정합니다. 이 구문에서는 모든 숫자 인수가 실수여야 합니다.

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

예제

예제

모두 축소

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

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

A = sym(wilkinson(4))
A = 

(32100112100112100132)

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

R = qr(A)
R = 

(1324 13132 13130013 532610 13 536892 13 53530053 381106172 53 3812019300035 381762)

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

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

A = sym(pascal(3))
A = 

(111123136)

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

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

(33-2266330-63332266)

R = 

(32 310 33025 220066)

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

TF = isAlways(A == Q*R)
TF = 3×3 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)

A와 Q*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개를 갖는 구문을 지정하여 치환을 사용하십시오. 기호 변수, 표현식 또는 함수를 포함하지 않는 행렬의 경우, 이 구문은 반환되는 행렬 R의 abs(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'*b와 A = Q*R이 되는 행렬 C와 R을 구합니다.

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

해 X를 계산합니다.

X = R\C
X = 

(57120197706572801271630)

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

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

   1
   1
   1
   1
   1

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

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

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-σ13 1010012-510-2 3 10156612510-3 1030-6312σ13 101566)where  σ1=3 510

R = 

(25050000)

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

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

(12-3 51012-51012510123 510)

R = 

(2505)

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

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

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

(123x)

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

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

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

R = 

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

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

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

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

R = 

(1010 3 x+2100x210-6 x5+185)

입력 인수

모두 축소

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

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

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

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

  • outputForm이 "vector"이면 P는 A(:,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'*B 및 X = R\C가 되는 행렬 방정식 A*X = B의 해를 나타내는 기호 행렬로 반환됩니다. 치환 출력값 P를 지정하면 outputForm이 "matrix"일 때는 해가 X = P*(R\C)가 되고, outputForm이 "vector"일 때는 해가 X(P,:) = R\C가 됩니다.

세부 정보

모두 축소

팁

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

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

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

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

버전 내역

R2014a에 개발됨

모두 확장

참고 항목

| | |