[英]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.