이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.
QR 분해
___ = qr(___,'real')
은 입력 인수와 중간 결과가 실수라고 가정하며, 그에 따라 abs
와 conj
에 대한 호출을 차단합니다. 이 플래그를 사용하면 qr
은 모든 기호 변수가 실수를 나타낸다고 가정합니다. 이 플래그를 사용할 때는 모든 숫자형 인수가 실수인지 확인하십시오.
결과가 켤레 복소수로 나오는 것을 방지하려면 'real'
을 사용하십시오.
4
×4
윌킨슨 고유값 테스트 행렬의 QR 분해의 R 부분을 계산합니다.
4
×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]
출력 인수가 하나인 구문을 사용하여 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]
3
×3
파스칼 행렬의 QR 분해를 계산합니다.
3
×3
파스칼 행렬을 만듭니다.
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으로 설정합니다. 부동소수점 숫자로 3
×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]
먼저 치환 없이 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]
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 분해의 수치적 안정성을 높이려면 출력 인수 3개를 갖는 구문을 지정하여 치환을 사용하십시오. 기호 변수, 표현식 또는 함수를 포함하지 않는 행렬의 경우, 이 구문은 반환되는 행렬 R
의 abs(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
을 사용하여 행렬 형식의 연립방정식을 풀 수 있습니다.
연립방정식 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 = Q'*B
와 A = Q*R
이 되는 행렬 C
와 R
을 구합니다.
[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 분해를 사용하십시오.
연립방정식 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 = Q'*B
와 A = Q*R
이 되는 행렬 C
와 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
×4
파스칼 행렬의 처음 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 분해를 계산합니다. 행 개수가 열 개수보다 크므로 qr
은 Q
의 처음 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 분해를 계산합니다. 기본적으로 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)]
상부 삼각 행렬 R
은 조건 R = chol(A'*A)
를 충족합니다.
인수 'econ'
과 0
은 반환된 행렬의 형태에만 영향을 줍니다.
기호 객체가 아닌 숫자형 행렬(sym
, syms
또는 vpa
로 만들지 않은 행렬)에 대해 qr
을 호출하면 MATLAB® qr
함수가 호출됩니다.
'vector'
대신 'matrix'
를 사용하면 기본적으로 qr
은 치환 행렬을 반환합니다. 'matrix'
와 'econ'
을 사용하면 qr
은 오류를 발생시킵니다.
기호 변수를 많이 사용한 행렬 계산은 속도가 느릴 수 있습니다. 계산 속도를 높이려면 일부 변수에 주어진 값을 대입하여 기호 변수의 수를 줄이십시오.