Java code calculating distance covariation

    private static double distanceCovariance(double[] x, double[] y) {
        int numSamples = x.length;

        double[][] a = new double[numSamples][numSamples];
        double[][] b = new double[numSamples][numSamples];
        for (int i = 0; i < numSamples; i++) {
            for (int j = 0; j < numSamples; j++) {
                a[i][j] = Math.abs(x[i] - x[j]);
                b[i][j] = Math.abs(y[i] - y[j]);
            }
        }

        double aMean = average(a);
        double bMean = average(b);
        double[] aRowMeans = new double[numSamples];
        double[] aColMeans = new double[numSamples];
        double[] bRowMeans = new double[numSamples];
        double[] bColMeans = new double[numSamples];
        for (int i = 0; i < numSamples; i++) {
            for (int j = 0; j < numSamples; j++) {
                aRowMeans[i] += a[i][j];
                aColMeans[i] += a[j][i];
                bRowMeans[i] += a[i][j];
                bColMeans[i] += a[j][i];
            }
        }
        for (int i = 0; i < numSamples; i++) {
            aRowMeans[i] /= numSamples;
            aColMeans[i] /= numSamples;
            bRowMeans[i] /= numSamples;
            bColMeans[i] /= numSamples;
        }

        double[][] A = new double[numSamples][numSamples];
        double[][] B = new double[numSamples][numSamples];
        for (int i = 0; i < numSamples; i++) {
            for (int j = 0; j < numSamples; j++) {
                A[i][j] = a[i][j] - aRowMeans[i] - aColMeans[j] + aMean;
                B[i][j] = b[i][j] - bRowMeans[i] - bColMeans[j] + bMean;
            }
        }

        double distanceCovariance = 0d;
        for (int i = 0; i < numSamples; i++) {
            for (int j = 0; j < numSamples; j++) {
                distanceCovariance += A[i][j] * B[i][j];
            }
        }

        return distanceCovariance / (numSamples * numSamples);
    }