我尝试使用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
答案 0 :(得分:0)
由于子矩阵太大而稀疏,因此在构造主矩阵时构造它更有效。这样我就不必重写大量的零。这明显更快!