22.1.4.3 Mathematical Considerations

Last-modified: 2025-03-06 (木) 21:25:20

22.1.4.3 数学的な考慮事項

スパース行列を、完全な行列とまったく同じように動作させる試みがなされました。ただし、特定の違いがあり、特に他の製品のスパース実装との違いがあります。

まず、演算子"./"と".^"演算子は注意して使用する必要があります。例で何が起こっているか考えてみましょう。

 s = speye (4);
 a1 = s .^ 2;
 a2 = s .^ s;
 a3 = s .^ -2;
 a4 = s ./ 2;
 a5 = 2 ./ s;
 a6 = s ./ s;

となります。sを 2 乗する最初の例では、問題は発生しません。ただし、 sを要素ごとにそれ自身に乗じると、多数の項が含まれ、0 .^ 0その数は 1 になります。完全な行列があります。 s .^ s

同様に、は無限大であるs .^ -2のような項が含まれており0 .^ -2、 はs .^ -2完全な行列でもある。

「./」演算子にはs ./ 2問題はありませんが、 多数の無限項も含まれており、同様に完全な行列です。 の場合、の ような項が含まれており、これは であり、したがって、これはsのゼロ要素が値で埋められた 完全な行列です。 2 ./ ss ./ s0 ./ 0NaNNaN

上記の動作は完全な行列と一致していますが、他の製品のスパース実装とは一致していません。

疎行列の特定の問題は、ゼロが格納されていないため、これらのゼロの符号ビットも同様に格納されていないという事実によって発生します。場合によっては、ゼロの符号ビットが重要です。例:

a = 0 ./ [-1, 1; 1, -1];
b = 1 ./ a
⇒ -Inf            Inf
    Inf           -Inf
c = 1 ./ sparse (a)
⇒  Inf            Inf
    Inf            Inf

この動作を修正するには、負の符号ビットを持つゼロ要素を行列に格納して、その符号ビットが尊重されるようにする必要があります。現時点では、効率上の理由から、これは実行されません。そのため、ゼロの符号ビットが重要な計算は、スパース行列を使用して実行してはならないことがユーザーに警告されます。

一般に、疎行列で使用される関数または演算子は、元の行列と同じかそれより多い数の非ゼロ要素を持つ疎行列になります。これは、疎行列の因数分解の重要なケースに特に当てはまります。これに対処する通常の方法は、行列の因数分解が元の行列の因数分解よりも疎になるように行列を並べ替えることです。つまり、 の因数分解は 、同等の因数分解 よりもL * U = P * S * Q疎な項とを持ちます。 LUL * U = S

因数分解する行列の種類に応じて、並べ替えに使用できる関数がいくつかあります。行列が対称正定値の場合は、symamdまたはcsymamdを使用する必要があります。それ以外の場合は 、 amd、colamdまたはccolamd を使用する必要があります。完全性のために、並べ替え関数colpermとrandpermも使用できます。

単純な正定値行列の構造の例については、 図22.3を参照してください。

spmatrix (1).png
Figure 22.3: 単純なスパース行列の構造

この行列の標準的なコレスキー分解は、完全な行列に使用するのと同じコマンドで取得できます。これは、 コマンドを使用して視覚化できます r = chol (A); spy (r);。図 22.4 を参照してください。元の行列には 598 個の非ゼロ項がありましたが、このコレスキー分解には 10200 個の非ゼロ項があり、対称行列の半分だけが格納されています。これは、重要なレベルの埋め込みであり、このような小さなテスト ケースでは問題になりませんが、他のスパース行列を操作する場合は大きなオーバーヘッドになる可能性があります。

元の行列の適切なスパース性保存順列はsymamdによって与えられ、この並べ替えを使用した因数分解は コマンドを使用して視覚化できますq = symamd (A); r = chol (A(q,q)); spy (r)。これにより、399 個の非ゼロ項が得られ、これは大幅な改善です。

コレスキー分解自体は、分解中に行列の適切なスパース性保存並べ替えを決定するために使用できます。その場合、これは 3 つの戻り引数として取得される可能性があります[r, p, q] = chol (A); spy (r)。

spchol.png
Figure 22.4: 上記の行列の置換されていないコレスキー分解の構造

spcholperm.png
Figure 22.5: 上記の行列の並べ替えられたコレスキー分解の構造

非対称行列の場合、適切なスパース性保存順列はcolamdであり、この並べ替えを使用した因数分解はコマンドを使用して視覚化できます q = colamd (A); [l, u, p] = lu (A(:,q)); spy (l+u)。

最後に、Octave は div (/) および ldiv (\) 演算子を使用するときに暗黙的に行列を並べ替えるため、パフォーマンスを最大化するためにユーザーが行列を明示的に並べ替える必要はありません。

: p = amd (S)

: p = amd (S, opts)

行列のおおよその最小次数順列を返します。

これは、 のコレスキー分解がS自体のコレスキー分解よりもスパースになる傾向があるような順列です 。 は通常、 よりも高速ですが、同様の目的を果たします。 S (p, p)amdsymamd

オプションパラメータoptsは、の動作を制御する構造体ですamd。構造体のフィールドは次のとおりです。

 opts.dense
 amd入力行列の密な行または列と見なすものを決定します。n は行列Sの次数ですが、エントリ数を超える行または列は、順列の計算中に無視されます。dense の値は正のスカラーでなければならず、デフォルト値は 10.0 です。 max (16, (dense * sqrt (n)))amd

 opts.aggressive
 この値がゼロ以外のスカラーの場合、amd積極的な吸収を実行します。デフォルトでは、積極的な吸収は実行されません。

コード自体の作者は Timothy A. Davis です ( http://faculty.cse.tamu.edu/davis/suitesparse.htmlを参照)

See also: symamd, colamd.

: p = ccolamd (S)

: p = ccolamd (S, knobs)

: p = ccolamd (S, knobs, cmember)

: [p, stats] = ccolamd (…)

制約付き列の近似最小次数順列。

p = ccolamd (S)疎行列Sの列近似最小次数置換ベクトルを返します。非対称行列Sの場合、 はSよりも疎な LU 因子を持つ傾向があります。 も よりも疎になる傾向があります。 の順序付けを最適化します 。順序付けの後には、列除去ツリーの事後順序付けが続きます。 S(:, p)chol (S(:, p)' * S(:, p))chol (S' * S)p = ccolamd (S, 1)lu (S(:, p))

ノブはオプションの 1 要素から 5 要素の入力ベクトルで、[0 10 10 1 0]存在しないか空の場合はデフォルト値になります。存在しないエントリはデフォルトに設定されます。

knobs(1)
ゼロ以外の場合、順序付けは に対して最適化されますlu (S(:, p))。 に対しては不適切な順序付けになります。これは ccolamd にとって最も重要なノブです。 chol (S(:, p)' * S(:, p))
knobs(2)
Sが m 行 n 列の 場合、エントリが 1 つ以上ある行は無視されます。 max (16, knobs(2) * sqrt (n))
knobs(3)
エントリが 個を超える列 は無視され、出力順列の最後に並べられます (cmember 制約に従います)。 max (16, knobs(3) * sqrt (min (m, n)))
knobs(4)
ゼロ以外の場合、積極的な吸収が実行されます。
knobs(5)
ゼロ以外の場合、統計とノブが印刷されます。

cmember は長さnのオプションのベクトルです。列の順序付けの制約を定義します。 の場合、列jは制約セットcに含まれます( c は1 から n の範囲である必要があります)。出力順列pでは、セット 1 のすべての列が最初に表示され、次にセット 2 のすべての列が続きます。 存在しないか空の場合は、 を返します。cmember(j) = ccmember = ones (1,n)ccolamd (S, [], 1 : n)1 : n

p = ccolamd (S)は とほぼ同じです 。 ノブがあり、デフォルト値は異なります。 は常に積極的な吸収を行い、との両方に適した順序付けを見つけます。 の順序付けを が可能な範囲まで 最適化することはできません。 p = colamd (S)colamdlu (S(:, p))chol (S(:, p)' * S(:, p))lu (S(:, p))ccolamd (S, 1)

stats は、入力行列Sの順序と有効性に関するデータを提供するオプションの 20 要素出力ベクトルです。順序統計は にありますstats(1 : 3)。 stats(1)は、 CCOLAMDstats(2)によって無視される密な行と列または空の行と列の数であり、 は、CCOLAMDによって使用される内部データ構造で実行されるガベージ コレクションの数です (およそ 整数サイズ)。 stats(3)2.2 * nnz (S) + 4 * m + 7 * n

stats(4 : 7)stats(4)CCOLAMD が続行できたかどうかの情報を提供します。がゼロの場合、 マトリックスは正常です。無効な場合は 1 です。stats(5)は、ソートされていないか重複エントリを含む右端の列インデックスです。そのような列が存在しない場合は 0 です。 は 、stats(6)で指定された列インデックス内の最後に見つかった重複または順序が間違っている行インデックスですstats(5)。そのような行インデックスが存在しない場合は 0 です。 stats(7)は、重複または順序が間違っている行インデックスの数です。 は、 CCOLAMDstats(8 : 20)の現在のバージョンでは常に 0 です(将来の使用のために予約されています)。

コード自体の作者は、S. Larimore、T. Davis、S. Rajamanickam で、J. Bilbert および E. Ng と共同で作業しています。国立科学財団 (DMS-9504974、DMS-9803599、CCR-0203270) および Sandia 国立研究所からの助成金によってサポートされています。ccolamd 、csymamd、amd、colamd、symamd、およびその他の関連する順序については、 http://faculty.cse.tamu.edu/davis/suitesparse.htmlを参照してください

See also: colamd, csymamd.

: p = colamd (S)

: p = colamd (S, knobs)

: [p, stats] = colamd (S)

: [p, stats] = colamd (S, knobs)

列の近似最小次数順列を計算します。

p = colamd (S)疎行列Sの列近似最小次数置換ベクトルを返します。非対称行列Sの場合、 はSよりも疎な LU 因子を持つ傾向があります。 のコレスキー分解 も のコレスキー分解よりも疎になる傾向があります。 S(:,p)S(:,p)' * S(:,p)S' * S

ノブはオプションの 1 から 3 要素の入力ベクトルです。S が m 行 n 列の場合、 を超える エントリを持つ行は無視されます。 を超える エントリを持つ列は順序付けの前に削除され、出力順列pの最後に順序付けられます。 およびが それぞれ < 0 の場合、完全に密な行または列のみが削除されます。 がゼロ以外の場合、統計とノブが印刷されます。デフォルトは です 。ノブは以前のバージョンの colamd とは異なることに注意してください。 max(16,knobs(1)*sqrt(n))max (16,knobs(2)*sqrt(min(m,n)))knobs(1)knobs(2)knobs(3)knobs = [10 10 0]

stats は、入力行列Sの順序と有効性に関するデータを提供するオプションの 20 要素出力ベクトルです。順序統計は にありますstats(1:3)。 stats(1)および は、 COLAMDstats(2)によって無視される密な行と列または空の行と列の数であり、 は、COLAMDによって使用される内部データ構造で実行されるガベージ コレクションの数です (およそ 整数サイズ)。 stats(3)2.2 * nnz(S) + 4 * m + 7 * n

Octave の組み込み関数は、重複エントリがなく、各列の非ゼロの行インデックスが昇順で、各列のエントリ数が非負 (!) などである有効な疎行列を生成することを目的としています。行列が無効である場合、COLAMD は続行できる場合とできない場合があります。重複エントリがある場合 (行インデックスが同じ列に 2 回以上出現する)、または列の行インデックスの順序が正しくない場合、COLAMD は重複エントリを無視し、行列Sの内部コピーの各列をソートすることでこれらのエラーを修正できます(ただし、入力行列Sは修復されません)。行列がその他の点で無効である場合、COLAMD は続行できず、エラー メッセージが印刷され、出力引数 ( pまたはstats ) は返されません。 したがって、 COLAMD は疎行列が有効かどうかを確認する簡単な方法です。

stats(4:7)COLAMD が続行できたかどうかの情報を提供します。stats(4)がゼロの場合、 行列は正常です。無効な場合は 1 です。stats(5)は、ソートされていないか重複エントリを含む右端の列インデックスです。そのような列が存在しない場合は 0 です。 は 、stats(6)で指定された列インデックス内の最後に見つかった重複または順序が間違っている行インデックスですstats(5)。そのような行インデックスが存在しない場合は 0 です。 stats(7)は、重複または順序が間違っている行インデックスの数です。 は、 COLAMDstats(8:20)の現在のバージョンでは常に 0 です(将来の使用のために予約されています)。

順序付けの後には、列削除ツリーによる後順序付けが続きます。

コード自体の作者は Stefan I. Larimore と Timothy A. Davis です。アルゴリズムは、Xerox PARC の John Gilbert と Oak Ridge National Laboratory の Esmond Ng との共同で開発されました。( http://faculty.cse.tamu.edu/davis/suitesparse.htmlを参照)

See also: colperm, symamd, ccolamd.

: p = colperm (s)

s(:, p)の列が 非ゼロ要素の数の増加順に並べられるような列順列を返します。

sが対称である場合、行と列を非ゼロ要素の数が増える順に並べる ように pが選択されます。s(p, p)

: p = csymamd (S)

: p = csymamd (S, knobs)

: p = csymamd (S, knobs, cmember)

: [p, stats] = csymamd (…)

対称正定値行列Sの場合、 Sよりもスパースなコレスキー因子を持つ傾向があるようなS(p,p)置換ベクトルpを返します。 S(p,p)

対称不定行列にもうまく機能する場合がcsymamdあります。行列S は対称であると想定され、厳密に下三角部分のみが参照されます。S は正方である必要があります。順序付けの後には、消去ツリーの事後順序付けが続きます。

ノブはオプションの 1 要素から 3 要素の入力ベクトルで、デフォルト値は です[10 1 0]。存在しないエントリはデフォルトに設定されます。

knobs(1)
Sが n 行 n 列の場合、エントリ数が多い行と列は 無視され、出力順列の最後に並べられます (cmember 制約に従います)。 max(16,knobs(1)*sqrt(n))
knobs(2)
ゼロ以外の場合、積極的な吸収が実行されます。
knobs(3)
ゼロ以外の場合、統計とノブが印刷されます。

cmember は長さ n のオプションのベクトルです。順序付けの制約を定義します。 の場合、行/列 j は制約セットcにあります( c は1 から n の範囲でなければなりません)。出力順列pでは、セット 1 の行/列が最初に表示され、次にセット 2 のすべての行/列が続き、以下同様に続きます。 が存在しないか空の場合は を返します 。 cmember(j) = Scmember = ones (1,n)csymamd (S,[],1:n)1:n

p = csymamd (S) is about the same as p = symamd (S). knobs and its default values differ.

stats(4:7)stats(4)CCOLAMD が続行できたかどうかの情報を提供します。がゼロの場合、 マトリックスは正常です。無効な場合は 1 です。stats(5)は、ソートされていないか重複エントリを含む右端の列インデックスです。そのような列が存在しない場合は 0 です。 は 、stats(6)で指定された列インデックス内の最後に見つかった重複または順序が間違っている行インデックスですstats(5)。そのような行インデックスが存在しない場合は 0 です。 stats(7)は、重複または順序が間違っている行インデックスの数です。 は、 CCOLAMDstats(8:20)の現在のバージョンでは常に 0 です(将来の使用のために予約されています)。

コード自体の作者は、S. Larimore、T. Davis、S. Rajamanickam で、J. Bilbert および E. Ng と共同で作業しています。国立科学財団 (DMS-9504974、DMS-9803599、CCR-0203270) および Sandia 国立研究所からの助成金によってサポートされています。ccolamd 、colamd、csymamd、amd、colamd、symamd、およびその他の関連する順序については、 http://faculty.cse.tamu.edu/davis/suitesparse.htmlを参照してください

See also: symamd, ccolamd.

: p = dmperm (A)

: [p, q, r, s, cc, rr] = dmperm (A)

疎行列 Aの Dulmage-Mendelsohn 置換を実行します。

単一の出力引数 の場合、列jが行iと一致する場合は となるdmperm最大マッチングpを返し、列jが一致しない場合は 0 を返します。A が正方かつ完全な構造ランクの場合、 p は行順列であり、ゼロフリーの対角線を持ちます。A の構造ランクはです。 p(j) = iA(p,:)sprank(A) = sum(p>0)

2 つ以上の出力引数で呼び出され、 Aの Dulmage-Mendelsohn 分解を返します。 pとq は順列ベクトルです。 ccとrr は長さ 5 のベクトルです c = A(p,q)。 4 行 4 列の粗いブロックのセットに分割されます。

  A11 A12 A13 A14
   0  0   A23 A24
   0  0    0  A34
   0  0    0  A44

ここでA12、、、A23は、A34ゼロのない対角線を持つ正方行列です。 の列はA11一致しない列で、 の行はA44一致しない行です。これらのブロックはいずれも空になることがあります。「粗い」分解では、(i,j) 番目のブロックは です C(rr(i):rr(i+1)-1,cc(j):cc(j+1)-1)。線形システムでは、 [A11 A12]はシステムの不確定部分 (常に長方形で、列と行の数が多い、つまり 0 行 0 列)、A23はシステムの確定部分 (常に正方形)、 [A34 ; A44]はシステムの過剰決定部分 (常に長方形で、行の数が列の数より多い、つまり 0 行 0 列) です。

Aの構造ランクは であり、これはAsprank (A) = rr(4)-1の数値ランクの上限です。 正確な算術では確率 1 です。 sprank(A) = rank(full(sprand(A)))

部分A23行列は、さらに「細かい」分解( の強く連結された成分A23)によってブロック上三角形式に分割されます。Aが正方行列で構造的に非特異な場合、A23は行列全体です。

C(r(i):r(i+1)-1,s(j):s(j+1)-1)は、細かい分解の (i,j) 番目のブロックです。(1,1) ブロックは[A11 A12]、このブロックが 0 行 0 列でない限り、長方形ブロック です。(b,b) ブロックは [A34 ; A44]、このブロックが 0 行 0 列でない限り、長方形ブロック ですb = length(r)-1。この形式の他のすべてのブロックはC(r(i):r(i+1)-1,s(i):s(i+1)-1)の対角ブロックでありA23、ゼロのない対角線を持つ正方形です。

使用される方法は、A. Pothen & C.-J. Fan. Computing the Block Triangular Form of a Sparse Matrix . ACM Trans. Math. Software, 16(4):303–324, 1990 に記載されています。

See also: colamd, ccolamd.

: p = symamd (S)

: p = symamd (S, knobs)

: [p, stats] = symamd (S)

: [p, stats] = symamd (S, knobs)

対称正定値行列Sの場合、 Sよりもスパースなコレスキー因子を持つ傾向があるような置換ベクトル p を返します。 S(p, p)

対称不定行列にもうまく機能することがありますsymamd。行列S は対称であると想定され、厳密に下三角部分のみが参照されます。S は正方行列でなければなりません。

ノブはオプションの 1 から 2 要素の入力ベクトルです。Sが n 行 n 列の場合、 を超える エントリを持つ行と列は順序付けの前に削除され、出力順列pの最後に順序付けられます。 の場合、行/列は削除されません。 が ゼロ以外の場合、統計とノブが印刷されます。デフォルトは です。 ノブはの以前のバージョンとは異なることに注意してください。 max (16,knobs(1)*sqrt(n))knobs(1) < 0knobs(2)knobs = [10 0]symamd

stats は、入力行列Sの順序と有効性に関するデータを提供するオプションの 20 要素出力ベクトルです。順序統計は にありますstats(1:3)。 は、SYMAMD によって無視される密な行と列または空の行と列の数であり、 は、SYMAMD によって使用される内部データ構造で実行されるガベージ コレクションの数です (およそ 整数サイズ)。 stats(1) = stats(2)stats(3)8.4 * nnz (tril (S, -1)) + 9 * n

Octave の組み込み関数は、重複エントリがなく、各列の非ゼロの行インデックスが昇順で、各列のエントリ数が非負 (!) などである有効な疎行列を生成することを目的としています。行列が無効である場合、SYMAMD は続行できる場合とできない場合があります。重複エントリがある場合 (行インデックスが同じ列に 2 回以上出現する)、または列の行インデックスの順序が正しくない場合、SYMAMD は重複エントリを無視し、行列 S の内部コピーの各列をソートすることでこれらのエラーを修正できます (ただし、入力行列 S は修復されません)。行列がその他の点で無効である場合、SYMAMD は続行できず、エラー メッセージが印刷され、出力引数 ( pまたはstats ) は返されません。SYMAMD は、疎行列が有効かどうかを確認する簡単な方法です。

stats(4:7)stats (4)SYMAMD が続行できたかどうかの情報を提供します。がゼロの場合、 マトリックスは正常です。無効な場合は 1 です。stats(5)は、ソートされていないか重複エントリを含む右端の列インデックスです。そのような列が存在しない場合は 0 です。 は 、stats(6)で指定された列インデックスで最後に見つかった重複または順序が間違っている行インデックスですstats(5)。そのような行インデックスが存在しない場合は 0 です。 stats(7)は、重複または順序が間違っている行インデックスの数です。 stats(8:20)は、SYMAMD の現在のバージョンでは常に 0 です (将来の使用のために予約されています)。

順序付けの後には、列削除ツリーによる後順序付けが続きます。

コード自体の作者は Stefan I. Larimore と Timothy A. Davis です。アルゴリズムは、Xerox PARC の John Gilbert と Oak Ridge National Laboratory の Esmond Ng との共同で開発されました。( http://faculty.cse.tamu.edu/davis/suitesparse.htmlを参照)

See also: colperm, colamd.

: p = symrcm (S)

Sの対称逆 Cuthill-McKee 順列を返します。

p は、対角要素がSよりも対角線に近くなる傾向があるような順列ベクトルです 。これは、「長くて細い」問題から生じる行列の LU 分解またはコレスキー分解に適した事前順序付けです。対称 S と非対称Sの両方で機能します。 S(p, p)

このアルゴリズムは、NP完全帯域幅最小化問題に対するヒューリスティックなアプローチを表しています。実装は、

E. Cuthill、J. McKee。 「スパース対称行列の帯域幅の削減」。第24回ACM全国会議の議事録、157~172ページ、1969年、Brandon Press、ニュージャージー。

A. George、JWH Liu. 大規模スパース正定値システムのコンピュータによる解法、Prentice Hall 計算数学シリーズ、ISBN 0-13-165274-5、1981 年。

See also: colperm, colamd, symamd.