我有一个名为scalling
的函数,其参数是多维数组array
,整数width
和height
。假设array
的长度为640x480,width
的长度为height
50和120.当我运行我的函数时,当长度640和index = 248million时,它给出了错误索引超出界限。请有人帮帮我吗?
这是我的代码:
private int[][] scalling(int[][] array, int width, int height){
int m = array.length;
int n = array[0].length;
int[][] G = new int[height][width];
double sy = height / m;
double sx = width / n;
if (sy > sx){
sy = sx;
}else{
sx = sy;
}
for (int i=0; i<height; i++){
double y = i/sy;
for (int j=0; j<width; j++){
double x = j/sx;
int p = (int) Math.floor(y);
int q = (int) Math.floor(x);
int a = (int) (y-p);
int b = (int) (x-q);
if ((q==n) || (p==m)){
G[i][j] = array[p][q];
}else{
double intensity= (1-a) * ((1-b) * array[p][q] +
b * array[p][q+1]) +
a * ((1-b) * array[p+1][q] +
b * array[p+1][q+1]);
G[i][j] = (int) intensity;
}
}
}
return G;
}
答案 0 :(得分:1)
两个int的分区_
double sy = height / m;
double sx = width / n;
要在除法完成之前返回双精度必须强制转换为:
double sy = (double)height / m;
double sx = (double)width / n;
否则,零或其他一些不稳定的值存储在double中。
double y = i/sy;
double x = j/sx;
在sx或sy中使用0.0会产生双值“正无穷大”。
int p = (int) Math.floor( y );
这会产生“2.48亿”。
稍后也可疑......
if ((q==n) || (p==m)){
G[i][j] = array[p][q];
鉴于以下设置:
int m = array.length;
int n = array[0].length;
上述数组访问导致索引超出范围。您最多只能访问array.length-1。
更多强>
sx = sy = Math.min(sx, sy); // prefer this to an if statement.
这几乎不正确:
int p = (int) Math.floor(y); // p biggest integer below y
int q = (int) Math.floor(x);
int a = (int) (y-p); // y-p is a fraction in [0,1.0) and so a = 0, always
int b = (int) (x-q);
所以,a和b总是0。
稍后这会产生我认为可能是对的。请注意,必须选择宽度和高度以匹配int[][] array
的尺寸,例如,如果这是int [4] [4],则宽度必须等于高度,或者如果它是int [4] [6 ]我们必须有宽度:高度= 3:2。
private static int[][] scaling(int[][] array, int width, int height){
int m = array.length;
int n = array[0].length;
int[][] G = new int[height][width];
double sy = height / m;
double sx = width / n;
sx = sy = Math.min( sx, sy );
for (int i=0; i<height; i++){
double y = i/sy;
for (int j=0; j<width; j++){
double x = j/sx;
int p = (int) Math.floor(y);
int q = (int) Math.floor(x);
double a = y - p;
double b = x - q;
if( q == n-1 || p == m-1 ){
G[i][j] = array[p][q];
} else {
double intensity= (1-a) * ((1-b) * array[p][q] +
b * array[p][q+1]) +
a * ((1-b) * array[p+1][q] +
b * array[p+1][q+1]);
G[i][j] = (int) intensity;
}
}
}
return G;
}