Как я могу суммировать целые числа столбца в этом 2D-массиве?

Следующий код вычисляет сумму каждой строки 'int[,] a'. Я хочу изменить его, чтобы он вычислял сумму по столбцу; 1+1+1, 2+2+2, 3+3+3, 4+4+4 вместо каждой строки. Эти значения будут помещены внутрь 'int[] output'

static void Main(string[] args)
        {
            int[,] a = {{ 1, 2, 3, 4},
                        { 1, 2, 3, 4},
                        { 1, 2, 3, 4} };

            int[] b = SumColumn(a);
        }

 public static int[] SumColumn(int[,] a)
        {
            int[] output = new int[a.GetLength(1)];
            int sum = 0;
      
            for (int i = 0; i < a.GetLength(0); i++)
            {
                for (int j = 0; j < a.GetLength(1); j++)
                {
                    sum += a[i, j];
                }

                output[i] = sum;
                sum = 0;
            }
            return output;
        }

Итак, я попытался добавить счетчик и использовать логическое значение во вложенном цикле (и другие методы), однако у меня это не сработало.

Вы уже получили ответ, но вам определенно стоит попробовать самостоятельно отладить этот код и увидеть, что вы перепутали итерации по измерениям. Важно знать, как что-то отлаживать.

Ralf 13.02.2023 14:30

Обычно рекомендуется перемещать .GetLength за пределы цикла, так как это сравнительно медленная операция. В данном случае это не имеет значения, но может быть, если вы начнете использовать гораздо большие массивы.

JonasH 13.02.2023 14:41
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
50
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Просто поменяйте местами циклы i и j, чтобы сначала выполнить итерацию по столбцам, а затем выполнить итерацию для j-го элемента каждой строки в столбце:

public static int[] SumColumn(int[,] a)
{
    int[] output = new int[a.GetLength(1)];
    int sum = 0;

    for (int j = 0; j < a.GetLength(1); j++)
    {
        for (int i = 0; i < a.GetLength(0); i++)
        {
            sum += a[i, j];
        }

        output[j] = sum;
        sum = 0;
    }
    return output;
}

Эта функция инициализирует массив output длиной, равной количеству столбцов во входном массиве. Затем он объявляет целочисленную переменную sum для накопления результата для столбца.

Затем мы используем два вложенных цикла for для перебора строк и столбцов, но используем j и GetLength(1) во внешнем цикле для итерации по каждому столбцу, а i и GetLength(1) во внутреннем цикле для итерации для каждого j-го элемента для всех строк. Каждая итерация внутреннего цикла добавляет значение текущей ячейки к sum.

После суммирования значений во всех строках мы добавляем sum к текущему индексу output и сбрасываем его для использования в следующем столбце.

Ответ принят как подходящий

Код практически идентичен в обоих случаях. Только петли переворачиваются

    static void Main(string[] args)
    {
        int[,] a = {{ 1, 2, 3, 4},
                    { 1, 2, 3, 4},
                    { 1, 2, 3, 4} };

        int[] rowSums = RowSums(a);
        int[] colSums = ColumnSums(a);

        Console.WriteLine($"Row Sums: {string.Join(",", rowSums)}");
        Console.WriteLine($"Col Sums: {string.Join(",", colSums)}");
    }

    public static int[] ColumnSums(int[,] matrix)
    {
        int rowCount = matrix.GetLength(0);
        int colCount = matrix.GetLength(1);

        int[] result = new int[colCount];
        for (int j = 0; j < colCount; j++)
        {
            int sum = 0;
            for (int i = 0; i < rowCount; i++)
            {
                sum += matrix[i, j];
            }
            result[j] = sum;
        }
        return result;
    }
    public static int[] RowSums(int[,] matrix)
    {
        int rowCount = matrix.GetLength(0);
        int colCount = matrix.GetLength(1);

        int[] result = new int[rowCount];
        for (int i = 0; i < rowCount; i++)
        {
            int sum = 0;
            for (int j = 0; j < colCount; j++)
            {
                sum += matrix[i, j];
            }
            result[i] = sum;
        }
        return result;
    }

PS. В вашем коде нет необходимости устанавливать sum=0; в конце внешнего цикла, так как он будет установлен на ноль в начале следующего цикла.

Результат должен быть

Row Sums: 10,10,10
Col Sums: 3,6,9,12

Что-то вроде этого:

public static int[] SumColumn(int[,] array) {
  // Do not forget to validate public method arguments
  if (array is null)
    return null;

  // result is an array (an item for each column)
  // Note, that result will be filled by 0, so we don't have to use sum variable
  int[] result = new int[array.GetLength(1)];

  // For each column col
  for (int col = 0; col < result.Length; ++col) 
    for (int row = 0; row < array.GetLength(0); ++row) // ... we sum rows
      result[col] += array[row][col];

  return result; 
}

Другие вопросы по теме