22.1.4.2 演算子と関数の戻り値の型
スパース行列を使用する 2 つの基本的な理由は、メモリ使用量を削減することと、ゼロ要素の計算を行わなくて済むことです。この 2 つは、スパース行列演算子または関数の計算時間が非ゼロ要素の数とほぼ比例するという点で密接に関連しています。
したがって、行列の非ゼロ要素の密度が一定値を超えると、疎行列としてではなく、完全行列として保存する意味がなくなります。このため、完全行列を返す可能性が高い演算子と関数は、常に完全行列を返します。たとえば、疎行列にスカラー定数を追加すると、ほとんどの場合、完全行列になります。したがって、次の例は次のようになります。
speye (3) + 0 ⇒ 1 0 0 0 1 0 0 0 1
見ての通り完全な行列を返します。
フル行列とスパース行列の間には混合演算子と関数が存在するため、一般的には問題はありません。ただし、問題が発生するのは、スパース行列がフル行列に昇格され、後続の操作によって行列が再スパース化される場合です。このようなケースはまれですが、人工的に作成できます。たとえば、(fliplr (speye (3)) + speye (3)) - speye (3)スパース行列になるべきときにフル行列になるなどです。一般に、このようなケースが発生した場合、メモリのペナルティはわずかです。
しかし、Octaveの疎行列のこの動作が問題を引き起こすことが知られているケースが1つあります。それはdiag関数の処理です 。diagは入力引数の型に応じて疎行列を返すか完全行列を返すかを決定します。
a = diag (sparse ([1,2,3]), -1);
疎行列を返す必要があります。これが実際に行われるように、 sparse関数、およびspeyeなどのそれに基づく他の関数は、使用されるメモリが完全な表現よりも大きい場合でも、常に疎行列を返します。