このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
inv
説明
例
逆行列
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
は単位行列を生成します。inv
は浮動小数点計算を使用して逆行列を求めるため、実際には、Y*X
は単位行列 eye(size(X))
に近くなりますが、厳密に等価ではありません。
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*x = b
を、係数行列 A
の逆行列を求めることで解きます。タイミング情報を取得するには、tic
および toc
を使用します。
tic y = inv(A)*b; t = toc
t = 0.5247
計算の絶対誤差と残差誤差を見つけます。
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_inv
と err_bs
がどちらも 1e-6
単位の大きさであるという事実は、単に行列の条件数を反映したものです。
この例は典型的なものです。inv(A)*b
の代わりに A\b
を使用すると計算が 2 倍から 3 倍速くなり、残差はデータの大きさに対するコンピューターの相対的精度と同程度になります。
入力引数
詳細
逆行列
行列 X
は、 となる同じサイズの行列 Y
が存在する場合に可逆です。ここで、 は n
行 n
列の単位行列です。行列 Y
は、X
の逆行列と呼ばれます。
逆行列のない行列は特異行列です。正方行列は、行列式が正確にゼロの場合のみ特異行列となります。
ヒント
行列の明示的な逆行列を求める必要はあまりありません。関数
inv
は、線形方程式系 Ax = b を解くときにしばしば誤用されます。この方程式を解く 1 つの方法は、x = inv(A)*b
を使うことです。実行時間と数値精度の両面でより優れた方法は、行列バックスラッシュ演算子をx = A\b
のように使用することです。この場合、逆行列を明示的に求めることなく、ガウスの消去法を使って解を求めます。詳細については、mldivide
を参照してください。
アルゴリズム
inv
は、入力行列の LU 分解 (または、入力行列がエルミートの場合は LDL 分解) を実行します。その後、その結果を使用して、解が逆行列 inv(X)
である線形システムを形成します。スパース入力の場合、inv(X)
はスパース単位行列を作成し、バックスラッシュ X\speye(size(X))
を使用します。
拡張機能
C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。
使用上の注意事項および制限事項:
特異値行列の入力は、MATLAB® の結果と異なる非有限値を生成する場合があります。
スレッドベースの環境
MATLAB® の backgroundPool
を使用してバックグラウンドでコードを実行するか、Parallel Computing Toolbox™ の ThreadPool
を使用してコードを高速化します。
この関数はスレッドベースの環境を完全にサポートしています。詳細については、スレッドベースの環境での MATLAB 関数の実行を参照してください。
GPU 配列
Parallel Computing Toolbox™ を使用してグラフィックス処理装置 (GPU) 上で実行することにより、コードを高速化します。
X
は非スパースでなければなりません。MATLAB 関数
inv
は、X
が正しくスケーリングされていないか特異に近い場合、警告を出力します。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.60 GHz) 搭載のテスト システムで、関数 timingInv
を呼び出しました。
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは 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)