Использование LINQ для получения Max столбцов для двумерных матриц

Там должен так или иначе использовать LINQ для получения максимума каждого столбцы для двумерных матриц?

Предположите, что у меня есть следующее:

var arrays = new double[5,100]();

Я хочу получить максимум arrays[0,:], arrays[1,:] .... arrays[4,:]. Как использовать LINQ, чтобы сделать это?

Я мог иметь, используют такой метод

public double GetMax(double[,] arr, int rowIndex)
{
   var colCount = arr.GetLength(1);
   double max = 0.0;
   for(int i=0; i<colCount; i++)
   {
      max=Math.Max(Math.Abs(arr[rowIndex, i]), max);
   }
   return max;
}

Но я предпочел бы более сжатые способы сделать вещи.

5
задан Graviton 6 April 2010 в 04:24
поделиться

4 ответа

Я полагаю, вы всегда можете использовать Enumerable.Range как компактная форма индексированного доступа:

public static double GetMax(double[,] arr, int rowIndex)
{
    return (from col in Enumerable.Range(0, arr.GetLength(1))
            select arr[rowIndex, col]).Max();
}

И если вы хотите получить это для всех строк:

public static double[] GetMaxForAllRows(double[,] arr, int rowIndex)
{
    return (from row in Enumerable.Range(0, arr.GetLength(0))
            let cols = Enumerable.Range(0, arr.GetLength(1))
            select cols.Max(col => arr[row, col])).ToArray();
}
5
ответ дан 14 December 2019 в 01:05
поделиться

Вы можете использовать вложенные операторы from. Таким образом выполняется итерация по всему массиву с переменными диапазона, представляющими соответствующую позицию столбца / строки в таблице. Для каждого из чисел вы хотите проверить, является ли он новым максимумом в его строке или в его столбце.

0
ответ дан 14 December 2019 в 01:05
поделиться

LINQ не имеет методов, охватывающих многомерные массивы.

Однако, если вы можете преобразовать его в список или, может быть, сверните свои собственные расширения.

0
ответ дан 14 December 2019 в 01:05
поделиться

Я не думаю, что есть встроенный способ получить строку из многомерного массива. Однако вы можете написать метод расширения:

public static IEnumerable<T> Row<T>(this T[,] array, int rowIndex)
{
    var colCount = array.GetLength(1);
    for(int i=0; i<colCount; i++)
    {
        yield return arr[rowIndex, i];
    }
}

А затем просто используйте «обычный» LINQ:

var max = array.Row(i).Max();
4
ответ дан 14 December 2019 в 01:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: