2017-02-15 133 views
4

我有一个矩阵,我的任务是从我的矩阵填充一维数组。从矩阵填充一维数组

实施例:

1 2 3 

1 2 3 

1 2 3 

我需要总结列和填充每一列的总和在一维数组 这是我的代码(即不工作),(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

你的任务是填补一维数组,那么你为什么从该方法返回一个整数值,而不是一维数组? –

+0

删除'返回总数'的声明,它应该工作正常 – MKasprzyk

+0

我不明白我怎么能总结列和填充列的每个总和到一维数组 –

回答

4

您只需要2个for循环。对于每一列贯穿所有行并总结内容。在合适的索引处写下总和。然后在每列重设总和。您还需要返回数组。所以我改变了返回值:

如果您使用有意义的名称调用索引变量,它也会有所帮助。

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

所以,你需要评估二维矩阵,以获得逐列总和为一维数组。因此,首先必须将方法的返回类型更改为int[],而不是int

让我引用你必须移动到修复之前要注意几件事情:

  • 如果执行迭代循环其余的迭代过程中的返回将不会被执行。
  • 函数只能在一次调用中返回一个值。
  • 假设ij是两个正整数不等整数,则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]