Разница между Matrix, SparseMatrix и DenseMatrix в числовых значениях MathNet?

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

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

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: использовать только для создания диагональной матрицы - если вы не хотите использовать конструктор

Каждый из них оптимизирован для этого конкретного использования. Например, разреженная матрица использует формат 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.

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

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