【问题标题】:Difference between Matrix, SparseMatrix, and DenseMatrix in MathNet Numerics?MathNet Numerics 中的 Matrix、SparseMatrix 和 DenseMatrix 之间的区别?
【发布时间】:2019-08-21 02:40:15
【问题描述】:

我知道有些矩阵有很多数据,而其他矩阵主要有 0 或为空。但是,创建一个 SparseMatrix 对象来保存一个稀疏填充的矩阵与创建一个 DenseMatrix 对象来保存一个稀疏填充的矩阵相比有什么优势呢?就方法而言,它们似乎都提供或多或少相同的操作。

我还想知道您何时会使用 Matrix 对象来保存数据 - 与使用其他两个相比,是否有任何优势或情况。

【问题讨论】:

    标签: c# sparse-matrix math.net mathnet-numerics


    【解决方案1】:

    对于小矩阵(例如小于 1000x1000),密集矩阵效果很好。但在实践中,有很多问题需要更大的矩阵,但几乎所有值都为零(通常非零值靠近对角线)。使用稀疏矩阵,可以在密集结构不可行的情况下处理非常大的矩阵(因为它需要太多内存,或者在 CPU 时间方面计算成本很高)。

    请注意,截至今天,Math.NET Numerics 直接矩阵分解方法仅针对密集矩阵进行了优化;对稀疏数据使用迭代求解器。

    关于类型,在 Math.NET Numerics v3 中,双值矩阵的层次结构如下:

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

    Matrix&lt;T&gt; 指的是完整类型MathNet.Numerics.LinearAlgebra.Matrix&lt;T&gt;,带有 Double.MatrixMathNet.Numerics.LinearAlgebra.Double.Matrix

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

    【讨论】:

    • 您说'请注意,截至今天,Math.NET Numerics 直接矩阵分解方法仅针对密集矩阵进行了优化;对稀疏数据使用迭代求解器。因此,如果我要在稀疏的 200 x 3000 矩阵上使用 SVD,我还是应该将它存储在密集矩阵中?
    【解决方案2】:

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

    压缩稀疏行(CSR 或 CRS)

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

    请参阅wiki 了解更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多