2017-02-15 4 views
4

У меня есть матрица, моя миссия - заполнить 1D массив из моей матрицы.Заполнить массив 1D из матрицы

Пример:

1 2 3 

1 2 3 

1 2 3 

мне нужно суммировать столбцы и заполнить сумму каждого столбца в 1D массив Вот мой код (который не работает), (int[,] mat) матрица, что функция получает.

public static int sumcolumn(int[,] mat) 
{ 
    int sum = 0; 
    int[] sumcol = new int[mat.GetLength(0)]; 
    for (int y = 0; y < mat.GetLength(0); y++) 
    { 
     for (int i = 0; i < mat.GetLength(0); i++) 
     { 
      for (int j = 0; j < mat.GetLength(1); j++) 
      { 
       sum = sum + mat[j, i]; 
      } 
      sumcol[i] = sum; 
      return sum; 
      sum = 0; 
     } 
     return sum; 
    } 
    return sumcol; 
} 

Как мне выполнить эту миссию?

Заранее спасибо.

+0

Ваша миссия должна была заполнить 1D массив, то почему вы вернув целочисленное значение из метода вместо 1D массива? –

+0

delete 'return sum' statment и он должен работать нормально – MKasprzyk

+0

Я не понял, как я могу суммировать столбцы и заполнять каждую сумму столбцов в 1D-массив –

ответ

4

Вам нужно всего 2 цикла. Для каждого столбца пробегают все строки и суммируют содержимое. Напишите сумму в соответствующем индексе col. Затем после каждого столбца сбросьте сумму. Вам также нужно вернуть массив с суммой. Поэтому я изменил возвращаемое значение:

Также он помогает, если вы вызываете переменные индекса со значимыми именами.

public static int[] sumcolumn(int[,] mat) 
{ 
    int[] sumcol = new int[mat.GetLength(1)]; 

    for (int col = 0; col < mat.GetLength(1); col++) 
    { 
     for (int row = 0; row < mat.GetLength(0); row++) 
     { 
      // since sumcol is initially filled with zeros you can just 
      // sum up the values from mat onto the zeros in each cell 
      sumcol[col] += mat[row, col]; 
     } 
    } 
    return sumcol; 
} 

В основном вы можете проверить это следующим образом:

void Main() 
{ 
    int[,] array = { 
    { 1, 2, 3 }, 
    { 1, 2, 3 }, 
    { 1, 2, 3 },}; 

    // this is just for test display 
    Console.WriteLine(String.Join(" ", sumcolumn(array))); 

    // normally you would call it like this and catch the return value in a new array 
    int[] result = sumcolumn(array); 

} 
+0

Я думаю, что эта строка' sumcol [col] = sum; 'should были вне внутреннего цикла – Jamiec

+0

@Jamiec это не меняет конечный результат, но вы правы, нет необходимости писать результат на каждом шаге :) –

+0

Большое вам спасибо! Он отлично работает с моим кодом :-) –

2

Таким образом, вы должны оценить 2D-матрицу, чтобы получить столбец мудрое сумму в 1D массив. Итак, первое, что вам нужно сделать, это изменить тип возвращаемого метода на int[] вместо int.

Позволь мне процитировать несколько вещей, которые вы должны заметить, прежде чем перейти к починку:

  • Если выполнить возврат во время итерации остальных петель итераций не будет выполняться.
  • Функция может возвращать только одно значение за один вызов.
  • Пусть i и j являются двумя положительными неравными целыми числами, то a[i,j] и a[j,i] будут указывать на два разных элемента в матрице a.

В целом вы должны изменить сигнатуру метода вроде следующего:

public static int[] sumcolumn(int[,] mat) 
{ 
    int sum = 0; 
    int[] sumcol = new int[mat.GetLength(1)]; 

    for (int i= 0; i< mat.GetLength(1); i++) 
    { 
     sum = 0; // reset sum for next colomn 
     for (int j= 0; j< mat.GetLength(0); j++) 
     { 
      sum += mat[i, j]; 
     } 
     // iteration of column completed 
     sumcol[i] = sum; 
    } 
    return sumcol; 
} 
-1
public static int[] sumColumn(int[,] mat) 
{ 
    //int sum = 0; 
    int colCount = mat.GetLength(0); 
    int[] sumCol = new int[colCount]; 

    for (int y = 0; y < colCount; y++) 
    { 
     int rowCount = mat.GetLength(1); 
     sumCol[y] = 0; 

     for (int x = 0; x < rowCount; x++) 
     { 
      sumCol[y] += mat[y, x]; 
     } 

     //sum += sumCol[y]; 
    } 

    //return sum; 
    return sumCol; 
} 
1

Linq подход

int[,] array = new int[3, 3] { { 1, 2, 3 }, 
           { 1, 2, 3 }, 
           { 1, 2, 3 } }; 

int[] result = Enumerable.Range(0, array.GetUpperBound(1) + 1) 
         .Select(y => Enumerable.Range(0, array.GetUpperBound(0) + 1) 
         .Select(x => array[x, y]).Sum()).ToArray(); // [3,6,9]