Main Content

inv

역행렬(Matrix Inverse)

설명

예제

Y = inv(X)는 정사각 행렬 X역행렬을 계산합니다.

  • X^(-1)inv(X)와 동일합니다.

  • x = A\bx = inv(A)*b와 다르게 계산되며 연립방정식을 푸는 데 권장됩니다.

예제

모두 축소

3×3 행렬의 역행렬을 계산합니다.

X = [1 0 2; -1 5 0; 0 3 -9]
X = 3×3

     1     0     2
    -1     5     0
     0     3    -9

Y = inv(X)
Y = 3×3

    0.8824   -0.1176    0.1961
    0.1765    0.1765    0.0392
    0.0588    0.0588   -0.0980

결과를 확인합니다. 이상적으로는 Y*X가 단위 행렬을 생성해야 합니다. 그러나, 실제 Y*X는 단위 행렬 eye(size(X))와 가깝지만 정확하게 같지는 않습니다. 그 이유는 inv가 부동소수점 계산을 사용하여 행렬의 역행렬을 구하기 때문입니다.

Y*X
ans = 3×3

    1.0000    0.0000   -0.0000
         0    1.0000   -0.0000
         0   -0.0000    1.0000

inv(A)*b로 역행렬을 구해 선형 시스템을 푸는 방법이 백슬래시 연산자 x = A\b를 사용하여 선형 시스템을 직접 푸는 방법보다 못한 이유를 검토합니다.

차수가 500인 확률 행렬 A를 만들어 조건수 cond(A)1e10이 되고 노름 norm(A)1이 되도록 합니다. 엄밀해 x는 길이가 500인 확률 벡터이고 우변은 b = A*x입니다. 따라서 선형 연립방정식은 조건이 나쁘지만 해가 존재합니다.

n = 500; 
Q = orth(randn(n,n));
d = logspace(0,-10,n);
A = Q*diag(d)*Q';
x = randn(n,1);
b = A*x;

계수 행렬 A의 역행렬을 구해 선형 시스템 A*x = b를 풉니다. 시간을 측정하려면 tictoc을 사용하십시오.

tic
y = inv(A)*b; 
t = toc
t = 0.5247

계산의 절대 오차와 잔차 오차(Residual Error)를 구합니다.

err_inv = norm(y-x)
err_inv = 3.3813e-06
res_inv = norm(A*y-b)
res_inv = 4.6577e-07

이제 백슬래시 연산자 \를 사용하여 동일한 선형 시스템을 풉니다.

tic
z = A\b;
t1 = toc
t1 = 0.3137
err_bs = norm(z-x)
err_bs = 2.6561e-06
res_bs = norm(A*z-b)
res_bs = 2.6734e-15

백슬래시 계산은 연산 속도가 더 빠르며 잔차 오차가 훨씬 더 작습니다. err_inverr_bs는 모두 1e-6 정도이고, 이는 행렬의 조건수가 그대로 반영된 결과입니다.

이 예제는 전형적인 결과를 보여주고 있습니다. inv(A)*b 대신 A\b를 사용하면 계산이 두세 배 빨라지며, 행렬 크기에 비례하여 계산 정밀도에 따라 잔차를 발생시킵니다.

입력 인수

모두 축소

입력 행렬로, 정사각 행렬로 지정됩니다. X가 준특이 행렬(badly scaled)이거나 유사 특이 행렬(Nearly Singular)이면 inv 계산은 수치적 정확도를 잃습니다. 행렬의 조건수를 확인하려면 rcondcond를 사용하십시오.

데이터형: single | double
복소수 지원 여부:

세부 정보

모두 축소

역행렬(Matrix Inverse)

XY=YX=In처럼 동일한 크기의 행렬 Y가 있는 경우 행렬 X는 가역 행렬입니다. 여기서 Inn×n 단위 행렬입니다. 행렬 YX의 역행렬이라고 합니다.

역행렬이 없는 행렬은 특이 행렬입니다. 정사각 행렬은 행렬식이 정확하게 0인 경우에만 특이 행렬입니다.

  • 행렬의 명시적(Explicit) 역행렬을 구할 필요는 거의 없습니다. 그럼에도 불구하고 선형 연립방정식 Ax = b를 풀 때 inv를 잘못 사용하는 경우가 자주 발생합니다. 선형 방정식 시스템을 x = inv(A)*b를 사용해 풀 수 있습니다. 그러나 실행 시간과 수치적 정확도 측면에서 보면, 행렬 백슬래시 연산자 x = A\b를 사용하는 것이 더 낫습니다. 이 방법은 역행렬을 명시적으로 구하지 않고 가우스 소거법(Gaussian Elimination)을 사용하여 해를 구합니다. 자세한 내용은 mldivide를 참조하십시오.

알고리즘

inv는 입력 행렬의 LU 분해를 수행합니다(입력 행렬이 에르미트(Hermitian) 행렬인 경우에는 LDL 분해 수행). 그런 다음, 결과값을 사용하여 해가 역행렬 inv(X)인 선형 시스템을 구성합니다. 희소 형식 입력값의 경우 inv(X)X\speye(size(X))처럼 희소 단위 행렬을 만들고 백슬래시를 사용합니다.

확장 기능

버전 내역

R2006a 이전에 개발됨

모두 확장

참고 항목

| | |