MathNet Numerics中Matrix,SparseMatrix和DenseMatrix之间的区别?

时间:2014-07-11 02:10:15

标签: c# sparse-matrix mathnet

据我所知,某些矩阵有很多数据,而其他矩阵主要是0或空。但是,创建一个SparseMatrix对象以保持稀疏填充的矩阵而不是创建一个DenseMatrix对象来保存稀疏填充的矩阵有什么好处?就方法而言,它们似乎都提供了或多或少相同的操作。

我也想知道你何时会使用Matrix对象来保存数据 - 因为有什么优势或情况比使用其他两个更优先。

2 个答案:

答案 0 :(得分:3)

对于小矩阵(例如小于1000x1000),密集矩阵运行良好。但实际上存在许多问题需要更大的矩阵,但几乎所有的值都是零(通常非零值接近对角线)。对于稀疏矩阵,在密集结构不可行的情况下可以处理非常大的矩阵(因为它需要太多内存,或者用CPU时间来计算昂贵的费用)。

请注意,截至目前,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.MatrixMathNet.Numerics.LinearAlgebra.Double.Matrix等等。

  • Matrix<double>:始终仅使用此泛型类型声明所有变量,属性和参数。实际上,在大多数情况下,这是用户代码中唯一需要的类型。
  • Double.Matrix:不要使用
  • Double.DenseMatrix:仅用于创建密集矩阵 - 如果您不想使用构建器(Matrix<double>.Build.Dense...
  • Double.SparseMatrix:仅用于创建稀疏矩阵 - 如果您不想使用构建器
  • Double.DiagonalMatrix:仅用于创建对角矩阵 - 如果您不想使用构建器

答案 1 :(得分:1)

它们均针对特定用途进行了优化。例如,稀疏矩阵使用CSR格式。

  

压缩稀疏行(CSR或CRS)

     

CSR与耶鲁稀疏矩阵格式实际上完全相同,除了   列数组通常存储在行索引数组之前。   即CSR是(val,col_ind,row_ptr),其中val是数组   (从左到右,然后从上到下)矩阵的非零值;   col_ind是与值对应的列索引;和,   row_ptr是每行开始的值索引列表。名字   基于行索引信息是相对压缩的事实   到COO格式。一个通常使用另一种格式(LIL,DOK,COO)   用于施工。这种格式对算术运算有效,   行切片和矩阵向量积。请参阅scipy.sparse.csr_matrix。

有关详细信息,请参阅wiki