据我所知,某些矩阵有很多数据,而其他矩阵主要是0或空。但是,创建一个SparseMatrix对象以保持稀疏填充的矩阵而不是创建一个DenseMatrix对象来保存稀疏填充的矩阵有什么好处?就方法而言,它们似乎都提供了或多或少相同的操作。
我也想知道你何时会使用Matrix对象来保存数据 - 因为有什么优势或情况比使用其他两个更优先。
答案 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.Matrix
到MathNet.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。