簡體   English   中英

MathNet數值中的Matrix,SparseMatrix和DenseMatrix之間的區別?

[英]Difference between Matrix, SparseMatrix, and DenseMatrix in MathNet Numerics?

我知道有些矩陣有很多數據,而另一些矩陣主要有0或為空。 但是,創建一個SparseMatrix對象來保存一個稀疏填充的矩陣比創建一個DenseMatrix對象來保存一個稀疏填充的矩陣有什么好處呢? 就方法而言,它們似乎都提供或多或少的相同操作。

我也想知道您何時使用Matrix對象保存數據-在任何優點或情況下,這比使用其他兩個對象更可取。

對於小型矩陣(例如,小於1000x1000),密集矩陣可以很好地工作。 但是實際上,存在許多問題,需要更大的矩陣,但是幾乎所有值都是零(通常非零值接近對角線)。 使用稀疏矩陣,可以在密集結構不可行的情況下處理非常大的矩陣(因為它需要過多的內存或使用CPU時間明智的方式來進行昂貴的計算)。

請注意,到目前為止,Math.NET數值直接矩陣分解方法僅針對密集矩陣進行了優化。 而是使用迭代求解器來處理稀疏數據。

關於類型,在Math.NET Numerics v3中,雙值矩陣的層次結構如下:

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

使用Matrix<T>我指的是完整類型MathNet.Numerics.LinearAlgebra.Matrix<T> ,而Double.MatrixMathNet.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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM