繁体   English   中英

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

[英]Looking for an efficient way to update multi-dimensional arrays

我更新了多维数组的值(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])

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

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 ,即使这可能是不可能的,因为它可能产生不等价的结果。 例如,这将是其中一个或两个以某种相关方式有状态的情况,例如通过关闭计数器。

据我所知,你的代码是你的目标是将y [0] [0] [10]设置g ,将其他元素设置为f

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

Arrays.fill(Y, f);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM