【问题标题】:Value cannot be resolved无法解析值
【发布时间】:2013-11-16 21:21:09
【问题描述】:

下面代码sn-p的目的是创建一个矩阵的实例,然后计算一个nxn矩阵的行列式。但是,方法computeDet 不会返回,因为出现以下错误:value cannot be resolved to a variable。这是为什么?
** 从here 编辑的行列式代码(此代码有效 - 没有错误)

public class MatrixArrayCR {
long[][] matrix;

public MatrixArrayCR(long[] arr) {
    double len = Math.sqrt(arr.length);
    int counter = 0;
    for (int i=0; i==len; i++) {
        for (int j=0; j==len; j++) {
            matrix[i][j] = arr[counter];
            counter++;
        }
    }
}
// determinant method edited from code off http://www.coderanch.com/t/446179/java/java/Learning-Project
    public long determinant() {
        return computeDet(matrix);
    }
    public long computeDet(long[][] matrix) {
        int matrixSize = matrix.length;
        if (matrixSize==2) {
            return matrix[0][0]*matrix[1][1]-matrix[0][1]*matrix[1][0];
        } else {
            long value = 0;
            for (int i=0; i<matrixSize; i++) {
                long[][] minor=generateMinor(matrix,0,i);
                value += (sgn(i)*matrix[0][i]*computeDet(minor));
            }
        } return value; //ERROR HERE
    }
    private int sgn(int n) {
        if (n%2==0) {
            return 1;
        } else {
            return -1;
        }
    }
    private long[][] generateMinor(long[][] matrix, int row, int column) {
        int matrixSize = matrix.length;
        int minorSize = matrixSize -1;
        int counterOne = 0;
        int counterTwo = 0;
        long[][] minor = new long[minorSize][minorSize];

        for (int i=0; i<matrixSize; i++) {
            if (i==row) {
                continue;
            } for (int j=0; j<matrixSize; j++) {
                if (j==column) {
                    continue;
                } minor[counterOne][counterTwo] = matrix[i][j];
                ++ counterTwo;
            } ++counterOne;
            counterTwo = 0;
        } return minor;
    }
}

【问题讨论】:

    标签: java matrix determinants


    【解决方案1】:

    value 是一个局部变量,即它只在它被声明的块中可见。由于您在 else 块中声明了 value 并尝试在此块之外返回它,因此您会收到此错误。

    return 语句应该在 else 块中。即:

    public long computeDet(long[][] matrix) {
            int matrixSize = matrix.length;
            if (matrixSize==2) {
                return matrix[0][0]*matrix[1][1]-matrix[0][1]*matrix[1][0];
            } else {
                long value = 0;
                for (int i=0; i<matrixSize; i++) {
                    long[][] minor=generateMinor(matrix,0,i);
                    value += (sgn(i)*matrix[0][i]*computeDet(minor));
                }
                return value; 
            }
        }
    

    【讨论】:

      【解决方案2】:

      value 变量在 if 或 else 块内声明,并且仅在它声明的块内可见。如果您希望它在方法的末尾可见,请在方法的开头声明它,在 if/else 块之前。

      public long computeDet(long[][] matrix) {
          long value = 0L;
          int matrixSize = matrix.length;
          if (matrixSize==2) {
              value = matrix[0][0]*matrix[1][1]-matrix[0][1]*matrix[1][0];
          } else {
              for (int i=0; i<matrixSize; i++) {
                  long[][] minor=generateMinor(matrix,0,i);
                  value += (sgn(i)*matrix[0][i]*computeDet(minor));
              }
          } 
          return value; 
      }
      

      或者从 else 块的 inside 返回它:

      public long computeDet(long[][] matrix) {
          int matrixSize = matrix.length;
          if (matrixSize==2) {
              return matrix[0][0]*matrix[1][1]-matrix[0][1]*matrix[1][0];
          } else {
              long value = 0;
              for (int i=0; i<matrixSize; i++) {
                  long[][] minor=generateMinor(matrix,0,i);
                  value += (sgn(i)*matrix[0][i]*computeDet(minor));
              }
              return value; //ERROR HERE
           }  // this guy moved
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-04
        • 2022-08-09
        • 2019-08-03
        • 2013-04-11
        • 2021-12-29
        • 2015-09-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多