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 в последнем поле массива указателя строки, хотя мы, вероятно, изменим это в ближайшем будущем (чтобы стать полностью совместимым, а также для упрощения кода)