Ошибка Java, несовместимая с JAMA, не может быть преобразована

Я пытаюсь написать код, который позволяет мне создать матрицу 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);
    }

}

То есть для создания матрицы. И затем я хочу использовать эту матрицу в следующем коде. Когда я использую «возврат 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

Любые советы о том, как заставить его правильно выводить матрицу?


person Jared Bland    schedule 29.04.2015    source источник


Ответы (1)


Обратите внимание на возвращаемый тип PopulateMatrix():

public void PopulateMatrix() { ... }

Вы говорите, что он ничего не возвращает, делая его void, поэтому, когда вы пытаетесь вернуть Matrix, вы получаете сообщение об ошибке, в котором говорится, что это неожиданный тип возврата.

Если вы хотите вернуть Matrix из PopulateMatrix(), вы должны изменить тип возвращаемого значения на 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.
person Anderson Vieira    schedule 29.04.2015
comment
Спасибо. Я внес некоторые изменения, как вы предложили, но теперь результат не совсем правильный. Мне нужно вывести результат в виде матрицы. - person Jared Bland; 29.04.2015
comment
@JaredBland Если вам нужно напечатать JAMA Matrix, вам, вероятно, следует использовать Matrix.print(). Взгляните на документацию здесь< /а>. - person Anderson Vieira; 29.04.2015