C# MathNet数值计算中矩阵、稀疏矩阵和密集矩阵之间的差异?

C# MathNet数值计算中矩阵、稀疏矩阵和密集矩阵之间的差异?,c#,sparse-matrix,math.net,mathnet-numerics,C#,Sparse Matrix,Math.net,Mathnet Numerics,我知道有些矩阵有很多数据,而有些矩阵主要是0或是空的。但是,创建SparseMatrix对象来保存稀疏填充的矩阵比创建DenseMatrix对象来保存稀疏填充的矩阵有什么好处呢?就方法而言,它们似乎都提供了或多或少相同的操作 我还想知道什么时候你会使用矩阵对象来保存数据——比如,与使用其他两个对象相比,使用矩阵对象有什么优势或情况更可取。它们都是针对特定用途而优化的。例如,稀疏矩阵使用CSR格式 压缩稀疏行(CSR或CRS) CSR实际上与耶鲁稀疏矩阵格式相同,除了 列数组通常存储在行索引数组之

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


我还想知道什么时候你会使用矩阵对象来保存数据——比如,与使用其他两个对象相比,使用矩阵对象有什么优势或情况更可取。

它们都是针对特定用途而优化的。例如,稀疏矩阵使用CSR格式

压缩稀疏行(CSR或CRS)

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


有关更多信息,请参阅。

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

压缩稀疏行(CSR或CRS)

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

有关更多信息,请参阅。

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

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

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

Matrix<double>
  |- Double.Matrix
       |- Double.DenseMatrix
       |- Double.SparseMatrix
       |- Double.DiagonalMatrix
矩阵
|-双重矩阵
|-双密度矩阵
|-双空位矩阵
|-双对角矩阵
使用
矩阵
我指的是完整的类型
MathNet.Numerics.linearagebra.Matrix
,使用
Double.Matrix
MathNet.Numerics.LinearAlgebra.Double.Matrix

  • 矩阵
    :始终仅使用此泛型类型声明所有变量、属性和参数。实际上,在大多数情况下,这是用户代码中唯一需要的类型
  • Double.Matrix
    :不要使用
  • Double.DenseMatrix
    :仅用于创建密集矩阵-如果您不希望使用生成器(
    matrix.Build.DenseMatrix…
  • Double.SparseMatrix
    :仅用于创建稀疏矩阵-如果不希望使用生成器
  • Double.DiagonalMatrix
    :仅用于创建对角线矩阵-如果不希望使用生成器
对于小型基质(例如小于1000x1000)而言,致密基质效果良好。但在实践中,有很多问题需要更大的矩阵,但几乎所有的值都是零(通常非零值接近对角线)。使用稀疏矩阵,可以在密集结构不可行的情况下处理非常大的矩阵(因为它需要太多内存,或者使用CPU时间计算非常昂贵)

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

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

Matrix<double>
  |- Double.Matrix
       |- Double.DenseMatrix
       |- Double.SparseMatrix
       |- Double.DiagonalMatrix
矩阵
|-双重矩阵
|-双密度矩阵
|-双空位矩阵
|-双对角矩阵
使用
矩阵
我指的是完整的类型
MathNet.Numerics.linearagebra.Matrix
,使用
Double.Matrix
MathNet.Numerics.LinearAlgebra.Double.Matrix

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

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