Как умножить две матрицы разных размеров - PullRequest
0 голосов
/ 24 ноября 2018

Я работаю над простым алгоритмом шифрования, поэтому мне нужно умножить две матрицы:

Это первая:

86  65  76  76
69  45  71  82
65  78  68  69

Это вторая:

13  9   3   5
2   1   4   6
4   6   2   7
8   5   4   1

Согласно этой странице , с которой я работаю, результат должен быть:

2160    1675    974 1428
1927    1502    857 1194
1825    1416    919 1338

Здесь я оставляю код, который не работает:

public class encriptar {

public static void main(String[] args) {
    double[][] encriptador = new double[4][4];
    double[][] mensaje = new double[4][3];
    double[][] resultado = new double[4][3];

    encriptador[0][0] = 13;
    encriptador[0][1] = 9;
    encriptador[0][2] = 3;
    encriptador[0][3] = 5;
    encriptador[1][0] = 2;
    encriptador[1][1] = 1;
    encriptador[1][2] = 4;
    encriptador[1][3] = 6;
    encriptador[2][0] = 4;
    encriptador[2][1] = 6;
    encriptador[2][2] = 2;
    encriptador[2][3] = 7;
    encriptador[3][0] = 8;
    encriptador[3][1] = 5;
    encriptador[3][2] = 4;
    encriptador[3][3] = 1;

    mensaje[0][0] = 86;
    mensaje[1][0] = 65;
    mensaje[2][0] = 76;
    mensaje[3][0] = 76;
    mensaje[0][1] = 69;
    mensaje[1][1] = 45;
    mensaje[2][1] = 71;
    mensaje[3][1] = 82;
    mensaje[0][2] = 65;
    mensaje[1][2] = 78;
    mensaje[2][2] = 68;
    mensaje[3][2] = 69;

    resultado = multiplicarMatrizes(encriptador, mensaje);

    imprimirMatriz(resultado);

}

public static double[][] multiplicarMatrizes(double[][] llave, double[][] mensaje) {
    double[][] resultado = new double[llave.length][mensaje[0].length];
    if (llave.length == llave[0].length && mensaje.length == llave.length) {
        for (int k = 0; k < llave.length; k++) {
            for (int mc = 0; mc < mensaje.length; mc++) {
                for (int lf = 0; lf < mensaje.length; lf++) {
                    resultado[lf][k] += mensaje[k][mc] * llave[mc][lf];
                }
            }
        }
    }
    return resultado;
}

public static void imprimirMatriz(double[][] matriz) {
    for (int i = 0; i < matriz[0].length; i++) {
        for (int l = 0; l < matriz.length; l++) {
            System.out.print(matriz[l][i] + " ");
        }
        System.out.println("");
    }
}
}

Очевидно, что в подсчете переменных в какой-то момент переменная не соответствует размеру матрицы, но я не смог ее решить.

1 Ответ

0 голосов
/ 24 ноября 2018

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

public class Main {

public static void main(String[] args) {
    int r1 = 3, c1 = 4;
    int r2 = 4, c2 = 4;
    int[][] firstMatrix = { {x, x, x, x}, {x, x, x, x}, {x, x, x, x} };
    int[][] secondMatrix = { {x, x, x, x}, {x, x, x, x}, {x, x, x, x}, {x, x, x, x} };

    // Mutliplying Two matrices
    int[][] product = multiplyMatrices(firstMatrix, secondMatrix, r1, c1, c2);

    // Displaying the result
    displayProduct(product);
}

public static int[][] multiplyMatrices(int[][] firstMatrix, int[][] secondMatrix, int r1, int c1, int c2) {
    int[][] product = new int[r1][c2];
    for(int i = 0; i < r1; i++) {
        for (int j = 0; j < c2; j++) {
            for (int k = 0; k < c1; k++) {
                product[i][j] += firstMatrix[i][k] * secondMatrix[k][j];
            }
        }
    }

    return product;
}

public static void displayProduct(int[][] product) {
    System.out.println("Product of two matrices is: ");
    for(int[] row : product) {
        for (int column : row) {
            System.out.print(column + "    ");
        }
        System.out.println();
    }
}

}

В двойном массиве, его [строки] [столбцы] - ваш вывод будет иметь 3 строки и4 столбца (как вы можете видеть на своем веб-сайте), поэтому ваши размеры для результата должны быть resultado [3] [4].Ваша матрица менсаже должна быть [3] [4], а не [4] [3].Я думаю, что вы можете выяснить, все остальное.

...