対称ではないスパース行列IEのスパース性はややランダムであり、対角線から設定された距離にあるすべての値を当てにすることはできません。
ただし、それでもまだまばらであり、マトリックスのストレージ要件を減らしたいと思います。したがって、最初の非ゼロから始まり、最後の非ゼロに到達するまで、各行を順番に格納する方法を理解しようとしています。
つまり、行mの最初の非ゼロが列2にあり、最後の非ゼロが列89にある場合、A[m]行2->89に格納します。
各行には同じ数の非ゼロがないため、Aのすべての行に同じ数の要素を持たせ、非ゼロ要素の数が少ない行の行の最後にゼロを埋め込みます。 。
この翻訳をCで行うにはどうすればよいですか?私は実際には、値をコピーするための元の完全なマトリックスを持っていません(元のマトリックスはCSR形式で私に届きます)。これをFortranで行っている場合は、配列を2次元として定義し、ゼロ以外の列の開始/停止値を追跡して各行を可変長にし、そのように格納することができます。
以下にデモンストレーションを試みます。
これは私が知っている値のマトリックス表現です-そして各値について、私は行と列の位置を知っています
[1 2 3 4 ]
[ 5 6 7 8 ]
[ 10 11 12 13 ]
m[ 14 15 16 17 18 ]
[ 19 20 21 22 ]
この1つの行m
では、最初の非ゼロと最後の非ゼロの間の「スパン」が最大であるため、新しいマトリックスは次のようになります。5x[span of row m]
[1 2 3 4 ]
[5 6 7 8 ]
[10 11 12 13 ]
m[14 15 16 17 18]
[19 20 21 22 ]
ご覧のとおり、行m
はとにかく最長の「スパン」であったため、ゼロのパディングは必要ありません。
他の行はすべて、最初の非ゼロとして行ゼロを持ち、各非ゼロ間のゼロ列の間隔を維持します。