我知道有些矩阵有很多数据,而其他矩阵主要有 0 或为空。但是,与创建 DenseMatrix 对象来保存稀疏矩阵相比,创建 SparseMatrix 对象来保存稀疏矩阵的优势是什么?就方法而言,它们似乎都提供或多或少相同的操作。
我还想知道你什么时候会使用 Matrix 对象来保存数据——因为是否有任何优势或情况比使用其他两个对象更受欢迎。
我知道有些矩阵有很多数据,而其他矩阵主要有 0 或为空。但是,与创建 DenseMatrix 对象来保存稀疏矩阵相比,创建 SparseMatrix 对象来保存稀疏矩阵的优势是什么?就方法而言,它们似乎都提供或多或少相同的操作。
我还想知道你什么时候会使用 Matrix 对象来保存数据——因为是否有任何优势或情况比使用其他两个对象更受欢迎。
对于小矩阵(例如小于 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.Matrix
toMathNet.Numerics.LinearAlgebra.Double.Matrix
等。
Matrix<double>
: 始终只使用此泛型类型声明所有变量、属性和参数。实际上,在大多数情况下,这是用户代码中唯一需要的类型。Double.Matrix
: 不使用Double.DenseMatrix
: 仅用于创建密集矩阵 - 如果您不想使用构建器 ( Matrix<double>.Build.Dense...
)Double.SparseMatrix
:仅用于创建稀疏矩阵 - 如果您不想使用构建器Double.DiagonalMatrix
:仅用于创建对角矩阵 - 如果您不想使用构建器它们都针对特定用途进行了优化。例如稀疏矩阵使用 CSR 格式。
压缩稀疏行(CSR 或 CRS)
CSR 实际上与耶鲁稀疏矩阵格式相同,除了列数组通常存储在行索引数组之前。即CSR是(val, col_ind, row_ptr),其中val是矩阵的(从左到右,然后从上到下)非零值的数组;col_ind 是与值对应的列索引;而且,row_ptr 是每行开始的值索引列表。该名称基于行索引信息相对于 COO 格式进行压缩的事实。通常使用另一种格式(LIL、DOK、COO)进行构建。这种格式对于算术运算、行切片和矩阵向量乘积非常有效。请参阅 scipy.sparse.csr_matrix。
有关更多信息,请参见wiki。