Разница между Matrix, SparseMatrix и DenseMatrix в MathNet Numerics?

Я понимаю, что в одних матрицах много данных, а в других в основном 0 или они пустые. Но в чем преимущество создания объекта SparseMatrix для хранения малонаселенной матрицы по сравнению с созданием объекта DenseMatrix для хранения малонаселенной матрицы? Они оба, похоже, предлагают более или менее одни и те же операции в отношении методов.

Мне также интересно, когда вы будете использовать объект Matrix для хранения данных — например, есть ли какие-либо преимущества или ситуации, когда это было бы предпочтительнее использования двух других.


person covfefe    schedule 11.07.2014    source источник


Ответы (2)


Для небольших матриц (например, менее 1000x1000) хорошо подходят плотные матрицы. Но на практике встречается множество задач, где нужны матрицы гораздо большего размера, но где почти все значения равны нулю (часто с ненулевыми значениями вблизи диагонали). С разреженными матрицами можно обрабатывать очень большие матрицы в тех случаях, когда плотная структура невозможна (потому что для нее требуется слишком много памяти или это слишком дорого для вычислений с использованием процессорного времени).

Обратите внимание, что на сегодняшний день методы прямой декомпозиции матриц Math.NET Numerics оптимизированы только для плотных матриц; вместо этого используйте итерационные решатели для разреженных данных.

Что касается типов, в Math.NET Numerics v3 иерархия матриц с двойным значением выглядит следующим образом:

Matrix<double>
  |- Double.Matrix
       |- Double.DenseMatrix
       |- Double.SparseMatrix
       |- Double.DiagonalMatrix

С Matrix<T> я обращаюсь к полному типу MathNet.Numerics.LinearAlgebra.Matrix<T>, с Double.Matrix к MathNet.Numerics.LinearAlgebra.Double.Matrix и т. д.

  • Matrix<double>: всегда объявляйте все переменные, свойства и аргументы, используя только этот универсальный тип. Действительно, в большинстве случаев это единственный тип, необходимый в пользовательском коде.
  • Double.Matrix: не использовать
  • Double.DenseMatrix: используйте только для создания плотной матрицы - если вы не хотите использовать конструктор (Matrix<double>.Build.Dense...)
  • Double.SparseMatrix: используйте только для создания разреженной матрицы — если вы не хотите использовать построитель
  • Double.DiagonalMatrix: используйте только для создания диагональной матрицы - если вы не хотите использовать конструктор
person Christoph Rüegg    schedule 12.07.2014
comment
Вы сказали: «Обратите внимание, что на сегодняшний день методы прямой декомпозиции матриц Math.NET Numerics оптимизированы только для плотных матриц; вместо этого используйте итерационные решатели для разреженных данных». Так что, если я буду использовать SVD на своей разреженной матрице 200 x 3000, мне все же следует хранить ее в плотной матрице? - person covfefe; 12.07.2014

Каждый из них оптимизирован для конкретного использования. Например, разреженная матрица использует формат CSR.

Сжатая разреженная строка (CSR или CRS)

CSR фактически идентичен формату Yale Sparse Matrix, за исключением того, что массив столбцов обычно хранится перед массивом индексов строк. т.е. CSR — (val, col_ind, row_ptr), где val — массив (слева направо, затем сверху вниз) ненулевых значений матрицы; col_ind — индексы столбцов, соответствующие значениям; и row_ptr — это список индексов значений, с которых начинается каждая строка. Название основано на том факте, что информация индекса строки сжата относительно формата COO. Обычно для построения используется другой формат (LIL, DOK, COO). Этот формат эффективен для арифметических операций, разделения строк и произведений матрицы на вектор. См. scipy.sparse.csr_matrix.

См. wiki для получения дополнительной информации.

person etr    schedule 11.07.2014