使用Math.floor函数时索引超出范围

时间:2014-12-29 10:51:03

标签: java android arrays multidimensional-array

我有一个名为scalling的函数,其参数是多维数组array,整数widthheight。假设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;
}

1 个答案:

答案 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;
}