从具有NaN的多维数组中找出最小值

时间:2013-03-13 19:45:20

标签: c# multidimensional-array nan min

我有一个二维数组(double[ , ]),我想知道什么是最小值。我尝试了Linq.Select.Min,但由于我的数组通常包含NaN个值,因此minvalue始终为NaN

所以,我需要一些方法来找到“跳过”NaN的最小值。

非常感谢任何帮助!

3 个答案:

答案 0 :(得分:4)

今天是扩展方法的一天!使用此选项可在所有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;
}

以下代码的输出是

的NaN
-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));

答案 1 :(得分:3)

试试这个:

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()无疑是可能的,我现在将研究它。

答案 2 :(得分:3)

public static double MinIsNumber(double[,] array)
{
    return array.Cast<double>()
        .Where(n => !double.IsNaN(n))
        .Min();
}