0

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

我还想知道你什么时候会使用 Matrix 对象来保存数据——因为是否有任何优势或情况比使用其他两个对象更受欢迎。

4

2 回答 2

5

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

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

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

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

With Matrix<T>I 指的是 full type MathNet.Numerics.LinearAlgebra.Matrix<T>, with Double.MatrixtoMathNet.Numerics.LinearAlgebra.Double.Matrix等。

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

于 2014-07-11T02:27:44.873 回答