csharp の MathNet.numerics を使用して、カスタムの最適化された行列演算 (使用している疎行列について知っていることに基づくスマート クロネッカー積) を作成したいと考えています。
スパース行列のゼロ以外の要素を取得するためのアクセサーはありますか? (またはインデックス?またはその反復子?またはCSR表現?)
csharp の MathNet.numerics を使用して、カスタムの最適化された行列演算 (使用している疎行列について知っていることに基づくスマート クロネッカー積) を作成したいと考えています。
スパース行列のゼロ以外の要素を取得するためのアクセサーはありますか? (またはインデックス?またはその反復子?またはCSR表現?)
を使用IndexedEnumerator
して、マトリックス内のゼロ以外の要素のみにアクセスできます。メソッドのシグネチャは次のとおりです。
public override IEnumerable<Tuple<int, int, double>> IndexedEnumerator()
たとえば、次のコード:
var mtx = new SparseMatrix(new DiagonalMatrix(3, 3, new[] {1.0, 1, 1}));
Console.WriteLine(mtx.NonZerosCount);
foreach (var tuple in mtx.IndexedEnumerator())
{
Console.WriteLine("({0},{1}) = {2}", tuple.Item1, tuple.Item2, tuple.Item3);
}
次の出力が得られます。
3
(0,0) = 1
(1,1) = 1
(2,2) = 1
v2.2.1 以降、生の CSR 表現に直接アクセスすることもできます。
var m = new SparseMatrix(1000,1000);
var csr = (SparseCompressedRowMatrixStorage<double>) m.Storage;
現在、CSR は行ポインター配列の最後のフィールドにゼロ以外の ValueCount を格納していないことに注意してください。ただし、近い将来、これを変更する可能性があります (完全に準拠し、コードを簡素化するため)。