21.5 ゼロ要素の扱いの違い¶
対角行列と順列行列をそれ自体で特別な行列オブジェクトにし、その結果、特定の操作にスマートなアルゴリズムを使用することで、副作用として、ゼロの扱いに若干の違いが生じます。このセクションの内容は、次の章で説明する疎行列にも適用されます。(疎行列を参照)
0*InfIEEE 浮動小数点標準では、式およびの結果を と定義しています 0*NaN。NaNこれは、良い妥協案として広く認められています。ただし、構造化行列およびスパース行列 (Octave を含む) を扱う数値ソフトウェアでは、ほとんどの場合、「数値ゼロ」と「仮定ゼロ」が区別されます。「数値ゼロ」とは、任意の浮動小数点値が発生する可能性のある場所に発生するゼロ値です。通常、明示的な値としてメモリのどこかに格納されます。一方、「仮定ゼロ」とは、行列構造 (対角、三角形) またはスパース パターンによって暗示されるゼロ行列要素です。その値は通常、明示的にどこにも格納されませんが、基礎となるデータ構造によって暗示されます。
主な違いは、仮定されたゼロを任意の数値で乗算したり、任意の非ゼロ数値で除算したりすると、たとえば を乗算したり で 除算した場合でも、常にゼロになるという点です。この動作の理由は、数値の乗算が基礎となるアルゴリズムによって実際には実行されず、結果がゼロであると仮定されるだけだからです。同様に、仮定されたゼロを含む計算の部分は、数値ではなく記号的に実行されると言えます。 InfNaN
この動作により、アルゴリズムの最も簡単で効率的な実装が容易になるだけでなく、次のような特定の有用な不変条件も保持されます。
スカラー * 対角行列は対角行列である
スパース行列/スカラーはスパースパターンを維持する
順列行列 * 行列は行を順列することと同等である
仮定されたゼロを数値として扱うと、これらすべての自然な数学的真理は無効になります。
MATLAB はこの原則に厳密に従うわけではなく、場合によっては想定されたゼロを数値のゼロに変換しますが、他の場合には変換しないことに 注意してください。現時点では、Octave でこのような動作を模倣する予定はありません。
仮定ゼロと数値ゼロの効果の例:
Inf * eye (3)
⇒
Inf 0 0
0 Inf 0
0 0 Inf
Inf * speye (3)
⇒
Compressed Column Sparse (rows = 3, cols = 3, nnz = 3 [33%])
(1, 1) -> Inf
(2, 2) -> Inf
(3, 3) -> Inf
Inf * full (eye (3))
⇒
Inf NaN NaN
NaN Inf NaN
NaN NaN Inf
diag (1:3) * [NaN; 1; 1]
⇒
NaN
2
3
sparse (1:3,1:3,1:3) * [NaN; 1; 1]
⇒
NaN
2
3
[1,0,0;0,2,0;0,0,3] * [NaN; 1; 1]
⇒
NaN
NaN
NaN