寻找一种更新多维数组的有效方法

时间:2019-01-04 20:15:47

标签: java arrays eclipse for-loop multidimensional-array

我更新多维数组(Y [i] [t] [k])的值。由于更新需要经过多次迭代才能完成,因此这部分代码的运行时间非常重要。我想知道是否有人知道如何以更有效的方式做到这一点。

下面是需要更新的部分。

double [][][] Y=new double [a.length][b.length][c.length];
for(int i=0;i<a.length;i++){
 for(int j=0;j<b;j++){
  for (int k=0; k<c.length; k++){
    if(i==w && j==r && k==u){// w, r and u can have any value.
      Y[i][j][k]=g;
     }else{
      Y[i][j][k]=f; 
     }
    }
  }
}

请注意:

    a is int [][].
    b is int.
    c is int [][].
    q is double.
    YIN is double [][][].
    F is double.
    g=q*YIN[i][j][k]+(1-q)*(Y[i][j][k]-F)
    f=q*YIN[i][j][k]+(1-q)*(Y[j][j][k])

2 个答案:

答案 0 :(得分:1)

您正在设置多维数组区域中的每个元素,其成本与设置的元素数量成正比,因此没有理由认为您可以渐近地更好地完成它。但是,很可能通过使用批量操作方法以及通过处理循环外的特殊情况而不是在每次迭代中进行测试来提高速度。例如,

for (int i = 0; i < a.length; i++) {
    for (int j = 0; j < b.length; j++) {
        Arrays.fill(Y[i][j], 0, c.length, f);
    }
}

if (c.length > 10) {
    Y[0][0][10] = g;
}

当然,这假设f是一个常量表达式,或者至少对其的每次求值都彼此相等(就==运算符而言),并且不会产生副作用。在这种情况下,使用批量复制代替批量设置可能会更好一些:

for (int i = 0; i < a.length; i++) {
    Arrays.fill(Y[i][0], 0, c.length, f);
    for (int j = 1; j < b.length; j++) {
        System.arraycopy(Y[i][0], 0, Y[i][j], 0, c.length);
    }
}

if (c.length > 10) {
    Y[0][0][10] = g;
}

如果表达式f不满足上述要求,那么您可能要做的就是将特殊情况从循环中移出,而不进行任何其他更改。对于某些表达式f和/或g,从可能产生不相等结果的意义上讲,即使这样做也不可能。例如,在其中一种或两种状态都以某种相关方式(例如通过关闭计数器)处于有状态的情况。

答案 1 :(得分:-1)

据您的代码了解,您的目标是将 Y [0] [0] [10] 设置为 g ,将其他元素设置为 f < / strong>。

那么如何忘记疯狂的循环并像下面的代码那样做呢?

Arrays.fill(Y, f);

Y[0][0][10] = g;