MathNet - 从大矩阵中提取大子矩阵的计算成本最低的方法

MathNet - Least computationally expensive way of extracting a large submatrix from a large matrix

我正在尝试使用 MathNet 包从父矩阵中提取一个大的子矩阵。我找不到内置函数来执行此操作,所以我在 VB.net:

中编写了这个简单的函数
Private Function Extract(s As Matrix, RowsAndColumns As Int32()) As SparseMatrix
    Dim Sadj = MathNet.Numerics.LinearAlgebra.Double.SparseMatrix.Build.Sparse(RowsAndColumns.Count, RowsAndColumns.Count)
    For i = 0 To RowsAndColumns.Count - 1
        For j = 0 To RowsAndColumns.Count - 1
            Sadj(i, j) = s(RowsAndColumns (i), RowsAndColumns (j))
        Next
    Next
    Return Sadj
End Function

但是,此函数的性能非常慢,因为通常原始矩阵非常大,子矩阵的大小接近。所以我正在寻找优化它的可能方法。任何帮助将不胜感激。

作为背景知识,我正在尝试从一个大的稀疏矩阵中提取一个子矩阵,然后使用 CSparse 求解一个大型方程组。

Dim Sred = Extract(S, FreeDOFs)
Dim storage = DirectCast(Sred.Storage, MathNet.Numerics.LinearAlgebra.Storage.SparseCompressedRowMatrixStorage(Of Double)) ' Get CSR storage.
Dim A = New CSparse.Double.SparseMatrix(Sred.ColumnCount, Sred.ColumnCount) With {.ColumnPointers = storage.RowPointers, .RowIndices = storage.ColumnIndices, .Values = storage.Values} ' Create CSparse matrix and Assign storage arrays.      
For i = 0 To NumofLoadCases - 1
    Dim Fred = Extract(NodeLoads.Item(ASP.AnalysisLoadCases.Keys(i)) - Pf.Item(ASP.AnalysisLoadCases.Keys(i)), FreeDOFs)
    Dim Dred = Sred.LU().Solve(Fred)
    Dvec.Add(ASP.AnalysisLoadCases.Keys(i), ReverseExtract(Dred, FreeDOFs, 6 * NumOfNodes))
Next

由于子矩阵又大又稀疏,在构造主矩阵的同时构造子矩阵效率更高。这样我就不必重写大量的零。这要快得多!