代码之家  ›  专栏  ›  技术社区  ›  Jean-François Beaulieu

Java参数传递int[][]

  •  0
  • Jean-François Beaulieu  · 技术社区  · 14 年前

    我试图用java编写一个简单的DCT算法。我希望findDCT方法有一个整数数组作为参数,如下所示:

    public class DCT {
        private Random generator = new Random();
        private static final int N = 8;
        private int[][] f = new int[N][N];
        private double[] c = new double[N];
    
        public DCT() {
            this.initializeCoefficients();
        }
    
        private void initializeCoefficients() {
            int value;
    
            // temporary - generation of random numbers between 0 and 255 
            for (int x=0;x<8;x++) {
                for (int y=0;y<8;y++) {
                  value = generator.nextInt(255);
                  f[x][y] = value;
                  System.out.println("Storing: "+value+" in: f["+x+"]["+y+"]");
                }
            }
    
            for (int i=1;i<N;i++) {
                c[i]=1/Math.sqrt(2.0);
                System.out.println("Storing: "+c[i]+" in: c["+i+"]");
            }
            c[0]=1;
        }
    
        public double[][] applyDCT() {
            double[][] F = new double[N][N];
            for (int u=0;u<N;u++) {
                  for (int v=0;v<N;v++) {
                    double somme = 0.0;
                    for (int i=0;i<N;i++) {
                      for (int j=0;j<N;j++) {
                        somme+=Math.cos(((2*i+1)/(2.0*N))*u*Math.PI)*Math.cos(((2*j+1)/(2.0*N))*v*Math.PI)*f[i][j];
                      }
                    }
                    somme*=(c[u]*c[v])/4;
                    F[u][v]=somme;
                  }
                }
            return F;
        }
    }
    

    现在,我如何声明这个方法,并能够将'int[][]f'作为参数传递,而不是使用f[][]作为私有变量声明并在当前类的构造函数中初始化?

    1 回复  |  直到 14 年前
        1
  •  0
  •   aioobe    14 年前

    提取 initializeCoefficients 并将构造函数从

    public DCT() {
        this.initializeCoefficients();
    }
    

    public DCT(int[][] f) {
        this.f = f;
    }
    

    你可以像

    double[][] dctApplied = new DCT(yourTwoDimF).applyDCT();
    

    而且,我不会用 N 你的方式。我会看看 f 在应用DCT时。

    也就是说,我会改变

        double[][] F = new double[N][N];
        for (int u=0;u<N;u++) {
              for (int v=0;v<N;v++) {
                  // ...
    

    有点像

        double[][] F = new double[f.length][];
        for (int u = 0; u < f.length; u++) {
              F[u] = new double[f[u].length];
              for (int v=0;v<N;v++) {
                  // ...