【问题标题】:Equivalent functionality of Matlab sortrows() in MathNET.Numerics?MathNET.Numerics 中 Matlab sortrows() 的等效功能?
【发布时间】:2020-10-15 19:32:54
【问题描述】:
是否存在与 Matlab 的 sortrows(A, column) 等效的 MathNET.Numerics,其中 A 是 Matrix<double>?
召回Matlab's documentation:
B = sortrows(A,column) 根据指定的列对 A 进行排序
向量列。例如, sortrows(A,4) 对 A 的行进行排序
根据第四列中的元素升序排列。
sortrows(A,[4 6]) 首先根据 A 中的元素对 A 的行进行排序
第四列,然后根据第六列的元素来
断绝关系。
【问题讨论】:
标签:
matlab
mathnet-numerics
【解决方案1】:
与我对您其他问题的回答类似,没有内置任何内容,但您可以在矩阵行的 Enumerable 上使用 Linq's OrderBy() 方法。给定一个Matrix<double> x,
x.EnumerateRows() 返回矩阵行的Enumerable<Vector<double>>。然后,您可以按每行的第一个元素对这个可枚举对象进行排序(如果这是您想要的)。
在 C# 中,
var y = Matrix<double>.Build.DenseOfRows(x.EnumerateRows().OrderBy(row => row[0]));
Example
写成extension method:
public static Matrix<double> SortRows(this Matrix<double> x, int sortByColumn = 0, bool desc = false) {
if (desc)
return Matrix<double>.Build.DenseOfRows(x.EnumerateRows().OrderByDescending(row => row[sortByColumn]));
else
return Matrix<double>.Build.DenseOfRows(x.EnumerateRows().OrderBy(row => row[sortByColumn]));
}
然后你可以这样调用:
var y = x.SortRows(0); // Sort by first column
Here's a big fiddle containing everything