【问题标题】:two dimensional array sum二维数组和
【发布时间】:2011-03-27 23:27:26
【问题描述】:

我有如下二维浮点数组

{0.2,0.0,0.3,0.0,0.0}
{0.4,0.1,0.0,0.0,0.9}
{0.0,0.0,0.0,0.3,0.6}

我想得到以下输出

{0.6,0.0,0.3,0.0,0.0}
{0.6,0.1,0.0,0.0,1.5}
{0.0,0.0,0.0,0.3,1.5}

如果您进行分析,我会对每一列的非零值求和,并使用该总和值更新所有非零值。例如,在第一列中,我求和 (0.2+0.4=0.4) 并将两个值位置更新为 0.6。

我正在使用 Java,我该如何执行此操作?这是一个简单的例子,实时我有非常大的数组。

【问题讨论】:

    标签: java arrays matrix


    【解决方案1】:

    假设它们的长度相同,则此方法有效。特殊情况供读者练习。

    class MatTest {
        static void makeSums(float[][] floats) {
            // we wouldn't be doing any operations on these inputs anyway, so return
            if(floats == null || floats.length == 0 || floats.length == 1) return;
    
            // check to make sure it's retangular
            for(float[] arr : floats) {
                if(arr.length != floats[0].length) {
                    throw new IllegalArgumentException("makeSums() requires rectangular array");
                }
            }
    
            for(int i = 0; i < floats[0].length; i++) {
                // do each column
                float sum = 0f;
                for(int j = 0; j < floats.length; j++) {
                    sum += floats[j][i];
                }
                for(int j = 0; j < floats.length; j++) {
                    if(floats[j][i] != 0) floats[j][i] = sum;
                }
            }
        }
    
        public static void main(String[] args) {
            float[][] floats = new float[3][5];
            floats[0] = new float[] {0.2f,0.0f,0.3f,0.0f,0.0f};
            floats[1] = new float[] {0.4f,0.1f,0.0f,0.0f,0.9f};
            floats[2] = new float[] {0.0f,0.0f,0.0f,0.3f,0.6f};
    
            makeSums(floats);
    
            for(int i = 0; i < floats.length; i++) {
                for(int j = 0; j < floats[0].length; j++) {
                    System.out.print(floats[i][j]);
                    System.out.print(" ");
                }
                System.out.println(" ");
            }
        }
    }
    

    结果如下:

     C:\Documents and Settings\glow\My Documents>javac MatTest.java
    
     C:\Documents and Settings\glow\My Documents>java MatTest
     0.6 0.0 0.3 0.0 0.0
     0.6 0.1 0.0 0.0 1.5
     0.0 0.0 0.0 0.3 1.5
    

    【讨论】:

    • 谢谢,一些简单的事情可能会占用你一整天的时间 :-)
    • 添加了一些特殊情况。
    【解决方案2】:

    让我们将您的输入数组 float[][] a 和并行输出数组 b 初始化为全零。

    float curSum = 0.0;   
    first = true;
    for(int i = 0; i < a[0].length; i++)
    {
        for(int j = 0; j < a.length; j++)
        { 
             if(a[i][j] != 0)
             {
                 if (first)
                 {
                     for(int k = j; k < a.length; k++)
                         curSum += a[i][k];
                     first = false;
                 }
                 b[i][j] = curSum;
             }
         }
         curSum = 0.0;
         first = true;
    }
    

    您可能需要更改一些更精细的点,例如浮动和其他东西的比较,但我认为这个想法就在那里

    我认为它在 O(n*m) 中运行,这看起来不太好,但我试图让迭代尽可能短。我没有看到任何更快的方法来做到这一点。即使有三个 for 循环,带有 k 的循环也只会在每个 j 循环中运行一次,因此它不会增加复杂性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-17
      • 1970-01-01
      • 2021-11-24
      • 1970-01-01
      相关资源
      最近更新 更多