Как правильно умножить 2 матрицы в этой задаче? - PullRequest
0 голосов
/ 27 сентября 2018

Это мой метод Mult:

public Matrix mult(Matrix otherMatrix) {
if(!colsEqualsOthersRows(otherMatrix)) // checks if Matrix A has the same number of columns as Matrix B has rows 
        return null;
    int multiplication[][] = new int[rows][columns];
    for(int r = 0; r < rows; r++) {
        for(int c = 0; c < otherMatrix.columns; c++) {
            int sum = 0;
            for(int i = 0; i < otherMatrix.columns; i++) {
                sum = sum + matrix[r][i]*otherMatrix.matrix[i][c];
                multiplication[r][c] = sum;
            }
        }
    }
return new Matrix(multiplication);
}

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

, т.е.

3BC-4BD //which is

B.mult(3).mult(C)).subtract(B.mult(4).mult(D));

Это ошибка.

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2

at lab1.Matrix. mult(Matrix.java:81)
at lab1.Driver. main(Driver.java:128)

Это матрицы, которые я использую.

Matrix A = new Matrix(new int[][] {{1,-2,3},{1,-1,0}});
    Matrix B = new Matrix(new int[][] {{3,4},{5,-1},{1,-1}});
    Matrix C = new Matrix(new int[][] {{4,-1,2},{-1,5,1}});
    Matrix D = new Matrix(new int[][] {{-1,0,1},{0,2,1}});
    Matrix E = new Matrix(new int[][] {{3,4},{-2,3},{0,1}});
    Matrix F = new Matrix(new int[][] {{2},{-3}});
    Matrix G = new Matrix(new int[][] {{2,-1}});

Это моя Матрица класс:

public class Matrix { 
    int [][] matrix; 
    int rows, columns; 

    public Matrix (int[][] m) { 
        this.matrix = m; 
        this.rows = m.length; 
        this.columns = m[0].length; 
    }
} 

Я новичок в языке JAVA, поэтому прошу прощения за мое невежество.Пожалуйста, помогите!

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Прежде всего, новая матрица - это this.rows, otherMatrix.columns, и при умножении вы дважды проверяете otherMatrix.columns, и я думаю, что вторая для той, которая должна быть this.columns

 public Matrix mult(Matrix otherMatrix) {
    if(!colsEqualsOthersRows(otherMatrix)) // checks if Matrix A has the same number of columns as Matrix B has rows
        return null;
    int multiplication[][] = new int[rows][otherMatrix.columns];
    for(int r = 0; r < rows; r++) {
        for(int c = 0; c < otherMatrix.columns; c++) {
            int sum = 0;
            for(int i = 0; i < columns; i++) {
                sum = sum + matrix[r][i]*otherMatrix.matrix[i][c];
                multiplication[r][c] = sum;
            }
        }
    }
    return new Matrix(multiplication);
}
0 голосов
/ 27 сентября 2018

Обратите внимание, что результат умножения матрицы следующий: A(nXm) * B (mXk) = C (nXk)

В вашем случае: B(2X3) * C(3X2) = Output(2X2)

Однако ваш код определяет выходную матрицу с размером первого(как можно увидеть здесь: int multiplication[][] = new int[rows][columns];)

Чтобы исправить это, попробуйте (добавьте 2 небольших оптимизации, установив multiplication[r][c] вне внутреннего цикла):

int multiplication[][] = new int[rows][otherMatrix.columns];
for(int r = 0; r < rows; r++) {
    for(int c = 0; c < otherMatrix.columns; c++) {
        int sum = 0;
        for(int i = 0; i < otherMatrix.columns; i++)
            sum += matrix[r][i]*otherMatrix.matrix[i][c];
        multiplication[r][c] = sum;
    }
...