我有一个二维数组 ( double[ , ]
),我想找出最小值是多少。我尝试了 Linq.Select.Min,但由于我的数组通常包含NaN
值,minvalue
所以总是NaN
.
所以,我需要一些方法来找到“跳过”NaN 的最小值。
任何帮助深表感谢!
我有一个二维数组 ( double[ , ]
),我想找出最小值是多少。我尝试了 Linq.Select.Min,但由于我的数组通常包含NaN
值,minvalue
所以总是NaN
.
所以,我需要一些方法来找到“跳过”NaN 的最小值。
任何帮助深表感谢!
今天是扩展方法的日子!使用它Min()
在您的所有double[,]
!
下面是一些通用的 [,] 扩展。请注意,这仅适用于实现的类型IComparable
这个什么都忽略:
public static T Min<T>(this T[,] arr) where T : IComparable
{
bool minSet = false;
T min = default(T);
for (int i = 0; i < arr.GetLength(0); i++)
for (int j = 0; j < arr.GetLength(1); j++)
if (!minSet)
{
minSet = true;
min = arr[i, j];
}
else if (arr[i, j].CompareTo(min) < 0)
min = arr[i, j];
return min;
}
这将让您指定一个要忽略的值,并且在数组仅包含忽略值的特殊情况下,它将返回忽略值。
public static T Min<T>(this T[,] arr, T ignore) where T : IComparable
{
bool minSet = false;
T min = default(T);
for (int i = 0; i < arr.GetLength(0); i++)
for (int j = 0; j < arr.GetLength(1); j++)
if (arr[i, j].CompareTo(ignore) != 0)
if (!minSet)
{
minSet = true;
min = arr[i, j];
}
else if (arr[i, j].CompareTo(min) < 0)
min = arr[i, j];
return (minSet) ? min : ignore;
}
以下代码的输出是
南
-10
double[,] d = new double[5, 5]
{
{ 0, 1, 2, 3, 4 },
{ 5, 6, 7, 8, 9 },
{ 10, 11, -10, 12, 13 },
{ 14, 15, 16, 17, 18 },
{ 19, double.NaN, 21, 22, 23 }
};
Console.WriteLine(d.Min());
Console.WriteLine(d.Min(double.NaN));
试试这个:
var minvalue = System.Linq.Enumerable.Range(0, 4)
.Where(i => !Double.IsNa(myarray[i,1]))
.Select(i => myarray[i, 1]).Min();
更新:
double[,] myarray = new double[4,4];
var rows = myarray.GetLength(0);
var cols = myarray.GetLength(1);
Enumerable.Range(0, rows * cols)
.Where(i => !Double.IsNaN(myarray[i/rows, i%rows]))
.Select(i => myarray[i/rows, i%rows])
.Min();
.Range() 的更高级使用无疑是可能的,我现在将对其进行研究。
public static double MinIsNumber(double[,] array)
{
return array.Cast<double>()
.Where(n => !double.IsNaN(n))
.Min();
}