【问题标题】:Java JAMA Incompatible Cannot be Converted ErrorJava JAMA 不兼容无法转换错误
【发布时间】:2015-04-29 00:01:04
【问题描述】:

我正在尝试编写一个代码,允许我创建一个 2x2 矩阵,然后使用 JAMA 库 (http://math.nist.gov/javanumerics/jama/) 来计算我刚刚创建的矩阵的特征值和特征向量。然后,我将使用迹确定形式将特征值与​​分析方法进行比较。

我的代码如下。第一个块是生成 2x2 矩阵,然后是第二个代码块来计算特征值和特征向量

import Jama.Matrix;
import Jama.EigenvalueDecomposition;
import Jama.*;
import java.util.Scanner;

/**
 * Code to generate a 2x2 matrix then find its eigenvalues and eigenvectors
 * Check eigenvalue computation using trick for 2x2 case 
 * ^(only possible for 2x2, not in general possible for general nxn)
 */
public class Matrix_For_Eval_Calc
{
    // instance variables - replace the example below with your own
    public Matrix A;
    // Create empty 2x2 array

    /**
     * Constructor for objects of class EigenvalueProblem
     * Input elements in array
     * Fill in elements of 2x2 matrix
     */
     public void PopulateMatrix()
    {
        // initialise instance variables
        // Prompt User Input for a_1,1 a_1,2 a_2,1 and a_2,2
        Scanner in = new Scanner(System.in);

        System.out.println("Enter the element a_{1,1}: ");
        double a_11 = in.nextInt();
        System.out.println("a_{1,1} = " + a_11 );

        System.out.println("Enter the element a_{1,2}: ");
        double a_12 = in.nextInt();
        System.out.println("a_{1,2} = " + a_12 );

        System.out.println("Enter the element a_{2,1}: ");
        double a_21 = in.nextInt();
        System.out.println("a_{2,1} = " + a_21 );

        System.out.println("Enter the element a_{2,2}: ");
        double a_22 = in.nextInt();
        System.out.println("a_{2,2} = " + a_22 );

        double[][] array = { {a_11 , a_12} , {a_21 , a_22} };
        Matrix A = new Matrix(array); 
        // System.out.println(A);
        // System.out.println(a_11 + "," + a_12);
        // System.out.println(a_21 + "," + a_22);
    }

}

那是为了创建矩阵。然后我想在下一个代码中使用该矩阵。当我使用''return A; '' 我收到另一个错误提示“不兼容的类型:意外的返回值”

    import Jama.Matrix;
import Jama.EigenvalueDecomposition;
import Jama.*;
import java.util.Scanner;

/**
 * Write a description of class EvalCalculation here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class EvalCalculation
{
    // instance variables - replace the example below with your own
    //private int x;

    public void EigenvalueCalc(Matrix InputMatrix) 
    {
        EigenvalueDecomposition somematrix = new EigenvalueDecomposition(InputMatrix);
        Matrix S = somematrix.getV();
        System.out.println("V = " + S);
        // Compute Evals and e-vecs
        // Print out
    }

当我创建一个矩阵,填充值,然后尝试在下一段代码中使用它时,我收到一个关于不兼容文件类型的错误,并且 Matrix_For_Eval_Calc 无法转换为矩阵。我想这是因为没有返回矩阵,但不知道如何补救。

非常感谢任何建议。

编辑:

import Jama.Matrix;
import Jama.EigenvalueDecomposition;
import Jama.*;
import java.util.Scanner;

/**
 * Code to generate a 2x2 matrix then find its eigenvalues and eigenvectors
 * Check eigenvalue computation using trick for 2x2 case 
 * ^(only possible for 2x2, not in general possible for general nxn)
 */
public class MatrixForEvalCalc
{
    // instance variables - replace the example below with your own
    public Matrix A;
    // Create empty 2x2 array

    /**
     * Constructor for objects of class EigenvalueProblem
     * Input elements in array
     * Fill in elements of 2x2 matrix
     */
     public void populateMatrix()
    {
        // initialise instance variables
        // Prompt User Input for a_1,1 a_1,2 a_2,1 and a_2,2
        Scanner in = new Scanner(System.in);

        System.out.println("Enter the element a_{1,1}: ");
        double a_11 = in.nextInt();
        System.out.println("a_{1,1} = " + a_11 );

        System.out.println("Enter the element a_{1,2}: ");
        double a_12 = in.nextInt();
        System.out.println("a_{1,2} = " + a_12 );

        System.out.println("Enter the element a_{2,1}: ");
        double a_21 = in.nextInt();
        System.out.println("a_{2,1} = " + a_21 );

        System.out.println("Enter the element a_{2,2}: ");
        double a_22 = in.nextInt();
        System.out.println("a_{2,2} = " + a_22 );

        double[][] array = { {a_11 , a_12} , {a_21 , a_22} };
        this.A = new Matrix(array); 
        // return A;
    }

}

第二部分

import Jama.Matrix;
import Jama.EigenvalueDecomposition;
import Jama.*;
import java.util.Scanner;

/**
 * Write a description of class EvalCalculation here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class EvalCalculation
{
    // instance variables - replace the example below with your own
    //private int x;

    public void eigenvalueCalc(Matrix inputMatrix) 
    {
        EigenvalueDecomposition someMatrix = new EigenvalueDecomposition(inputMatrix);
        Matrix S = someMatrix.getV();
        System.out.println("V = " + S);
        // Compute Evals and e-vecs
        // Print out
    }
}

我创建一个矩阵,填充它。然后使用您建议的输入

MatrixForEvalCalc matrixWrapper = new MatrixForEvalCalc();
matrixWrapper.PopulateMatrix();
EigenvalueCalc(matrixWrapper.A);

然后我得到一个输出 V = Jama.Matrix@1b213c5

关于如何使其正确输出矩阵的任何建议?

【问题讨论】:

    标签: java matrix eigenvector eigenvalue jama


    【解决方案1】:

    注意PopulateMatrix()的返回类型:

    public void PopulateMatrix() { ... }
    

    您说它不返回任何内容,将其设为 void,因此当您尝试返回 Matrix 时,您会收到一条错误消息,指出这是一个意外的返回类型。

    如果你想从PopulateMatrix()返回一个Matrix,你应该把它的返回类型改为Matrix

    public Matrix PopulateMatrix() {
        // rest of the code
        double[][] array = { {a_11 , a_12} , {a_21 , a_22} };
        Matrix A = new Matrix(array);
        return A;
    }
    

    但也许这并不是你想要的。您已经声明了一个实例字段Matrix A。当您执行Matrix A = new Matrix(array) 时,您正在创建一个具有相同名称的局部变量,而不是为实例字段分配值。如果你想做后者,你可以保持返回类型为void

    public void PopulateMatrix() {
        // rest of the code
        double[][] array = { {a_11 , a_12} , {a_21 , a_22} };
        this.A = new Matrix(array);
    }
    

    并直接访问该字段(因为您已将其公开):

    Matrix_For_Eval_Calc matrixWrapper = new Matrix_For_Eval_Calc();
    matrixWrapper.PopulateMatrix();
    EigenvalueCalc(matrixWrapper.A);
    

    附带说明,在命名变量、方法和类时,您应该尽量遵循 Java 约定:

    1. 变量名应该是驼峰式,以小写开头:InputMatrix 应该是InputMatrix
    2. 方法名称应为以小写开头的驼峰式:PopulateMatrix() 应为 populateMatrix()EigenvalueCalc() 应为 eigenvalueCalc()
    3. 类名应为大写开头的驼峰式:Matrix_For_Eval_Calc 应为 MatrixForEvalCalc

    【讨论】:

    • 谢谢。我已经按照您的建议进行了一些编辑,但现在输出不太正确。我需要将输出输出为矩阵。
    • @JaredBland 如果您需要打印 JAMA Matrix,您应该使用 Matrix.print()。看看documentation here
    猜你喜欢
    • 2016-09-05
    • 2023-01-18
    • 2021-04-27
    • 2019-07-10
    • 2019-12-24
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    • 2017-10-03
    相关资源
    最近更新 更多