2017-02-15 6 views
4

行列があります。私の使命は行列から1次元配列を塗りつぶすことです。行列から1次元配列を塗りつぶします

例:

1 2 3 

1 2 3 

1 2 3 

私は(int[,] mat)が機能することを行列である、(それが動作しません)ここに私のコードがある列を合計し、1次元配列 内のすべての列の合計を記入する必要があります取得。

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

あなたの使命は、1次元配列を埋めるためだった、そして、なぜあなたはしています1D配列の代わりにメソッドから整数値を返しますか? –

+0

'return sum'文を削除してもうまくいくはずです – 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; ' – Jamiec

+0

@Jamiec最終結果は変わりませんが、各ステップで結果を書く必要はありません:) –

+0

ありがとうございました! これは私のコードで完璧に動作します:-) –

2

は、だから、1次元配列に列方向合計値を取得するには、2D行列を評価する必要があります。だから最初にする必要がある方法の戻り値の型を変更するint[]intの代わりに。

私はあなたが修正するために移動する前に気づくために持っているいくつかのことを引用してみましょう:

  • あなたが繰り返しのループ残りの反復中の復帰を実行した場合は実行されません。
  • 関数は、1回の呼び出しで1つの値だけを返すことができます。
  • ijを2つの正の等しくない整数とすると、a[i,j]a[j,i]は、行列aの2つの異なる要素を指します。あなたは次のようなメソッドシグネチャを変更する必要があり、全体として

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] 
関連する問題