Zielony Smok - logo witryny

Mnożenie macierzy (Java)

Mnożenie macierzy przez macierz

Macierz możemy pomnożyć przez inną macierz, w tym macierz kolumnową albo wierszową. Jeżeli mnożymy macierz A przez macierz B to liczba kolumn A musi być równa liczbie wierszy B. Macierz wynikowa będzie miała tyle wierszy ile ma macierz A i tyle kolumn ile ich miała macierz B. Mnożenie macierzy na ogół nie jest przemienne. Mnożąc A x B otrzymamy inny wynik niż mnożąc B x A. Mnożenie w jednej kolejności może być wykonalne, a w drugą stronę nie. Jeśli jest wykonalne zmianie może ulec wymiar wyniku. Mnożenie macierzy jest przemienne jedynie dla niektórych macierzy kwadratowych.

Mnożenie macierzy

Pomnóżmy przez siebie dwie macierze:

macierz×Macierz=Mnożenie macierzy

Jeżeli przypomnimy sobie mnożenie skalarne wektorów i potraktujemy pierwszą tablicę jako trzy wektory wierszowe, a drugą tablicę jako trzy wektory kolumnowe, to:

  • pierwszy wiersz macierzy wynikowej to trzy iloczyny skalarne pierwszego wektora a przez kolejne wektory b
  • drugi wiersz macierzy wynikowej to trzy iloczyny skalarne drugiego wektora a przez kolejne wektory b
  • trzeci wiersz macierzy wynikowej to trzy iloczyny skalarne trzeciego wektora a przez kolejne wektory b

Zauważmy, że mnożymy A x B, ale zaczynamy od prawej strony, czyli od B.

Jeżeli mnożone macierze mają różne wielkości musimy najpierw sprawdzić dopuszczalność mnożenia:

Mnożenie macierzy

Ponieważ liczba kolumn w pierwszej macierzy = 3 i liczba wierszy w drugiej macierzy = 3 mnożenie jest wykonalne. Wynik będzie postaci 2 x 1.

=Mnożenie macierzy=Mnożenie macierzy

Dokonajmy odwrotnego mnożenia:

Mnożenie odwrotne

Ponieważ liczba kolumn w pierwszej macierzy = 1, a liczba wierszy w drugiej macierzy = 2 mnożenia nie można wykonać.

Pomnóżmy:

Mnożenie macierzy

Mnożenie jest wykonalne. Wynik jest postaci 1 x 1, czyli jest to skalar.

Mnożenie macierzy

Pomnóżmy:

Mnożenie macierzy

Mnożenie jest wykonalne. Wynik jest postaci 3 x 3.

=Mnożenie macierzy

Jeśli mnożymy macierz A przez macierz jednostkową I, to jest to równoznaczne z mnożeniem przez 1 w zwykłej
algebrze, czyli macierz A nie ulega zmianie. Mnożenie takie jest przemienne, tzn. może być wykonywane w dowolnej kolejności:

AI = IA = A

Mnożenie macierzy w języku Java możemy wykonać przy pomocy metod multiply(Matrix) i multiply2(Matrix) z klasy Matrix.

 public void multiply(Matrix n) {
        double[][] temp = new double[getRowCount()][n.getColCount()];
        for (int i = 0; i < getRowCount(); i++) {//2
            for (int j = 0; j < n.getColCount(); j++) {//2
                for (int k = 0; k < getColCount(); k++) {//3
                    try {
                        temp[i][j] += getCell(i, k) * n.getCell(k, j);
                    } catch (MatrixException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        this.setArray(temp);
    }
 public Matrix multiply2(Matrix n) {
        double[][] temp = new double[getRowCount()][n.getColCount()];
        for (int i = 0; i < getRowCount(); i++) {
            for (int j = 0; j < n.getColCount(); j++) {
                for (int k = 0; k < getColCount(); k++) {
                    try {
                        temp[i][j] += getCell(i, k) * n.getCell(k, j);
                    } catch (MatrixException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        return new Matrix(temp);
    }
Klasa Matrix017
  double[] array1 = {1, 2, 3, 4, 5, 6, 7, 8, 9};
        Matrix matrix1 = new Matrix(array1, 3);
        ArrayUtil.print(array1);
        double[] array2 = {9, 8, 7, 6, 5, 4, 3, 2, 1};
        Matrix matrix2 = new Matrix(array2, 3);
        ArrayUtil.print(array2);
        matrix1.multiply(matrix2);
        matrix1.printToConsole();

Po uruchomieniu otrzymujemy na konsoli:

[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]
[9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0]
30.0 24.0 18.0
84.0 69.0 54.0
138.0 114.0 90.0
Klasa Matrix018
        double[] array1 = {2, 0, 0, 0, 2, 0, 0, 0, 2};
        Matrix matrix1 = new Matrix(array1, 3);
        ArrayUtil.print(array1);
        double[] array2 = {3, 0, 0, 0, 3, 0, 0, 0, 3};
        Matrix matrix2 = new Matrix(array2, 3);
        ArrayUtil.print(array2);
        matrix1.multiply(matrix2);
        matrix1.printToConsole();
        boolean a = false;
        double[] diagonals = matrix2.getDiagonal();
        ArrayUtil.print(diagonals);
        try {
            a = matrix2.isScalarMatrix();
        } catch (MatrixException e) {
            e.printStackTrace();
        }
        Util.print(a);

Po uruchomieniu otrzymujemy na konsoli:\

[2.0, 0.0, 0.0, 0.0, 2.0, 0.0, 0.0, 0.0, 2.0]
[3.0, 0.0, 0.0, 0.0, 3.0, 0.0, 0.0, 0.0, 3.0]
6.0 0.0 0.0
0.0 6.0 0.0
0.0 0.0 6.0
[3.0, 3.0, 3.0]
true

Mnożenie macierzy przez macierz skalarną

Pomnożenie macierzy przez macierz skalarną jest równoznaczne pomnożeniu tej macierzy przez skalar α.

Mnożenie macierzy

Macierze skalarne dodaje się przez dodawanie skalarów:

Mnożenie macierzy

Macierze skalarne mnoży się przez pomnożenie skalarów:

Mnożenie macierzy

Klaa Matrix009
        double[] array1 = {2, 0, 0, 0, 2, 0, 0, 0, 2};
        Matrix matrix1 = new Matrix(array1, 3);
        ArrayUtil.print(array1);
        double[] array2 = {3, 0, 0, 0, 3, 0, 0, 0, 3};
        Matrix matrix2 = new Matrix(array2, 3);
        ArrayUtil.print(array2);
        matrix1.multiply(matrix2);
        matrix1.printToConsole();
        boolean a = false;
        double[] diagonals = matrix2.getDiagonal();
        ArrayUtil.print(diagonals);
        try {
            a = matrix2.isScalarMatrix();
        } catch (MatrixException e) {
            e.printStackTrace();
        }
        Util.print(a);

Po uruchomieniu na konsoli zobaczymy:

[2.0, 0.0, 0.0, 0.0, 2.0, 0.0, 0.0, 0.0, 2.0]
[3.0, 0.0, 0.0, 0.0, 3.0, 0.0, 0.0, 0.0, 3.0]
6.0 0.0 0.0
0.0 6.0 0.0
0.0 0.0 6.0
[3.0, 3.0, 3.0]
true

Pliki do ściągnięcia

matrices009.zip

Moduł matrices – aktualny stan projektu = 009;