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

时间:2017-09-03 21:33:07

标签: vb.net mathnet

我尝试使用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

1 个答案:

答案 0 :(得分:0)

由于子矩阵太大而稀疏,因此在构造主矩阵时构造它更有效。这样我就不必重写大量的零。这明显更快!