2次元のヒストグラム

今、ある値のペアのデータがあるとする。{{x1,y1},{x2,y2},...,{xn,yn}}。
これを、xについて、ある刻みで、yについてもある刻みで、a(j)<=xi

public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		int N=100;
		double[][] data=new double[3][N];
		for(int i=0;i<N;i++){
			data[0][i]=Math.random()*5;
			data[1][i]=Math.random()*0.4;
			data[2][i]=Math.random();
			
		}
		int[] kizami={10,5};
		double[] min={0,0};
		double[] max={5,0.5};
		double[][] hist=D2histogram(data,kizami,min,max);
		for(int i=0;i<hist.length;i++){
			for(int j=0;j<hist[i].length;j++){
				System.out.print(hist[i][j]+"\t");
			}
			System.out.println();
		}
		System.out.println();
		double[][] cumul=D2cumulative(hist);
		for(int i=0;i<cumul.length;i++){
			for(int j=0;j<cumul[i].length;j++){
				System.out.print(cumul[i][j]+"\t");
			}
			System.out.println();
		}

	}
	
	public static double[][] D2histogram(double[][] d,int[] kizami,double[] min,double[]max){
		double[][] ret = new double[kizami[0]][kizami[1]];
		
		for(int i=0;i<d[0].length;i++){
			int v1=(int)((d[0][i]-min[0])/(max[0]-min[0])*(double)kizami[0]);
			int v2=(int)((d[1][i]-min[1])/(max[1]-min[1])*(double)kizami[1]);
			ret[v1][v2]+=d[2][i];
		}
		
		return ret;
	}
	
	public static double[][] D2cumulative(double[][] d){
		double[][] ret = new double[d.length][d[0].length];
		ret[0][0]=d[0][0];
		for(int i=1;i<d.length;i++){
			ret[i][0]=ret[i-1][0]+d[i][0];
		}
		for(int i=1;i<d[0].length;i++){
			ret[0][i]=ret[0][i-1]+d[0][i];
		}
		for(int i=1;i<d.length;i++){
			for(int j=1;j<d[i].length;j++){
				ret[i][j]=ret[i-1][j]+ret[i][j-1]-ret[i-1][j-1]+d[i][j];
			}
		}
		return ret;
	}