C# Mathnet Numerics - получить индекс ненулевых элементов разреженной матрицы

Я хочу создать пользовательскую оптимизированную матричную операцию (умный продукт kronecker, основанный на том, что я знаю о разреженных матрицах, которые я использую), используя MathNet.numerics для csharp.

Есть ли аксессор для получения ненулевых элементов разреженной матрицы? (или индексы? Или их итератор? или CSR представление?)

2 ответа

Решение

Ты можешь использовать 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

Начиная с версии 2.2.1, вы также можете напрямую получить доступ к необработанному представлению CSR:

var m = new SparseMatrix(1000,1000);
var csr = (SparseCompressedRowMatrixStorage<double>) m.Storage;

Помните, что в настоящее время наш CSR не хранит ненулевое значение ValueCount в последнем поле массива указателя строки, хотя мы, вероятно, изменим это в ближайшем будущем (чтобы стать полностью совместимым, а также для упрощения кода)

Другие вопросы по тегам