Как я могу реализовать умножение матриц с BigInteger? - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь реализовать алгоритм умножения матриц, но у меня есть проблема, связанная с BigInteger.

public static void main(String[] args) {
   Scanner scan = new Scanner(System.in);

    System.out.println("Size of Matrix A");
   int tamA1 = scan.nextInt();
   int tamA2 = scan.nextInt();

    System.out.println("Size of Matrix B");
   int tamB1 = scan.nextInt();
   int tamB2 = scan.nextInt();

   BigInteger[][] A = new BigInteger[tamA1][tamA2];
   BigInteger[][] B = new BigInteger[tamB1] [tamB2];
   BigInteger[][] C = new BigInteger[A.length][B[0].length];



    System.out.println("Values of Matrix A");
    for (int i = 0; i < tamA1; i++) {
        for (int j = 0; j < tamA2; j++) {
            A[i][j] = scan.nextBigInteger();
        }
    }

    System.out.println("Values of Matrix B");
    for (int i = 0; i < tamB1; i++) {
        for (int j = 0; j < tamB2; j++) {
            B[i][j] = scan.nextBigInteger();
        }
    }


   if (A[0].length == B.length) {
    for (int i = 0; i < A.length; i++) {
        for (int j = 0; j < B[0].length; j++) {
            for (int k = 0; k < A[0].length; k++) {
                C[i][j] =C[i][j].add(A[i][k].multiply(B[k][j])); // Result
            }
        }
    }

   }

    System.out.println(" C is equal to: ");
    for (int i = 0; i < A.length; i++) {
        for (int j = 0; j < B.length; j++) {
            System.out.print(C[i][j]+" ");
        }
        System.out.println("");
    }


   }

Посмотрите на этот вывод:

Matrix A
2 2
Matrix B
2 2
Values of A
2 2
1 0
Values of B
3 4
5 6
Exception in thread "main" java.lang.NullPointerException
    at matrixmultiplication.MatrixMultiplication.main(MatrixMultiplication.java:56)
C:\Users\Luis Miguel\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1

Я не знаю, почему я могу сделать эту операцию с int, а не с BigInteger.

Заранее спасибо.

1 Ответ

0 голосов
/ 03 октября 2018

«Разница» (или действительно сходство, в зависимости от того, как вы к этому относитесь) между массивом int и массивом BigInteger заключается в том, что когда вы создаете новый массив целых чисел, все целые числа существуют(и равны нулю), в то время как новый массив BigInteger заполнен null.Конечно, add нельзя вызвать на null.

Существуют различные исправления, например, вы можете заполнить матрицу C нулями или изменить умножение, чтобы оно не считывалось изC вообще, но вместо этого суммирует в локальную переменную, которую вы инициализируете нулем.

...