inv
역행렬(Matrix Inverse)
설명
예제
역행렬
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
를 풉니다. 시간을 측정하려면 tic
과 toc
을 사용하십시오.
tic y = inv(A)*b; t = toc
t = 0.0216
계산의 절대 오차와 잔차 오차(Residual Error)를 구합니다.
err_inv = norm(y-x)
err_inv = 4.8457e-06
res_inv = norm(A*y-b)
res_inv = 4.8952e-07
이제 백슬래시 연산자 \
를 사용하여 동일한 선형 시스템을 풉니다.
tic z = A\b; t1 = toc
t1 = 0.0056
err_bs = norm(z-x)
err_bs = 3.7705e-06
res_bs = norm(A*z-b)
res_bs = 3.7080e-15
백슬래시 계산은 연산 속도가 더 빠르며 잔차 오차가 훨씬 더 작습니다. err_inv
와 err_bs
는 모두 1e-6
정도이고, 이는 행렬의 조건수가 그대로 반영된 결과입니다.
이 예제는 전형적인 결과를 보여주고 있습니다. inv(A)*b
대신 A\b
를 사용하면 계산이 두세 배 빨라지며, 행렬 크기에 비례하여 계산 정밀도에 따라 잔차를 발생시킵니다.
입력 인수
세부 정보
역행렬(Matrix Inverse)
처럼 동일한 크기의 행렬 Y
가 있는 경우 행렬 X
는 가역 행렬입니다. 여기서 은 n
×n
단위 행렬입니다. 행렬 Y
는 X
의 역행렬이라고 합니다.
역행렬이 없는 행렬은 특이 행렬입니다. 정사각 행렬은 행렬식이 정확하게 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))
처럼 희소 단위 행렬을 만들고 백슬래시를 사용합니다.
확장 기능
C/C++ 코드 생성
MATLAB® Coder™를 사용하여 C 코드나 C++ 코드를 생성할 수 있습니다.
사용법 관련 참고 및 제한 사항:
특이 행렬 입력값은 MATLAB® 결과와 다른 nonfinite 값을 생성할 수 있습니다.
스레드 기반 환경
MATLAB®의 backgroundPool
을 사용해 백그라운드에서 코드를 실행하거나 Parallel Computing Toolbox™의 ThreadPool
을 사용해 코드 실행 속도를 높일 수 있습니다.
이 함수는 스레드 기반 환경을 완전히 지원합니다. 자세한 내용은 스레드 기반 환경에서 MATLAB 함수 실행하기 항목을 참조하십시오.
GPU 배열
Parallel Computing Toolbox™를 사용해 GPU(그래픽스 처리 장치)에서 실행하여 코드 실행 속도를 높일 수 있습니다.
X
는 비희소 행렬이어야 합니다.MATLAB
inv
함수는X
가 준특이 행렬(badly scaled)이거나 유사 특이 행렬(nearly singular)이면 경고를 출력합니다.gpuArray
에 대해서는inv
가 이 조건을 확인할 수 없습니다. 따라서 이 조건을 피하기 위한 조치를 수행해야 합니다.
자세한 내용은 GPU에서 MATLAB 함수 실행하기 (Parallel Computing Toolbox) 항목을 참조하십시오.
분산 배열
Parallel Computing Toolbox™를 사용하여 대규모 배열을 클러스터의 결합된 메모리에 걸쳐 분할할 수 있습니다.
이 함수는 분산 배열을 완전히 지원합니다. 자세한 내용은 분산 배열을 사용하여 MATLAB 함수 실행 (Parallel Computing Toolbox) 항목을 참조하십시오.
버전 내역
R2006a 이전에 개발됨R2022a: 큰 삼각 행렬의 역행렬을 구할 때의 성능이 개선됨
inv
함수는 큰 삼각 행렬에 대한 연산을 수행할 때 향상된 성능을 보입니다.
예를 들어, 5,000×5,000 상부 삼각 행렬의 역행렬을 구하는 속도는 이전 릴리스보다 약 3.7배 빠릅니다.
function timingInv rng default A = randn(5e3); [~,R] = lu(A); tic Y = inv(R); toc end
대략적인 실행 시간은 다음과 같습니다.
R2021b: 1.1초
R2022a: 0.3초
코드 실행 시간은 Windows® 10, Intel® Xeon® CPU W-2133 @ 3.60GHz 테스트 시스템에서 timingInv
함수를 호출하여 측정했습니다.
MATLAB 명령
다음 MATLAB 명령에 해당하는 링크를 클릭했습니다.
명령을 실행하려면 MATLAB 명령 창에 입력하십시오. 웹 브라우저는 MATLAB 명령을 지원하지 않습니다.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)