Rodzaje macierzy (Java)
Istnieje wiele rodzajów macierzy, które nie są wymienione poniżej. Być może zostaną uwzględnione w dalszej przyszłości.
Macierz kwadratowa
Macierz kwadratowa to macierz, która ma jednakową liczbę wierszy i kolumn.
Macierzy o postaci:
w języku Java odpowiada tablica array[3][3]
.
Elementy macierzy podaje się w postaci , gdzie i oznacza numer rzędu, a j numer kolumny, na przecięciu których znajduje się element, a więc element a00 w tablicy byłby elementem array[0][0]
, czyli element leży w pierwszym rzędzie i w pierwszej kolumnie.
Poniższa metoda służy do badania czy macierz jest kwadratowa:
public boolean isSquareMatrix() { return getRowCount() == getColCount(); }
Macierz zerowa
Macierz zerowa, oznaczana literą Θ (theta), to macierz której wszystkie elementy są równe 0. Macierz można wyzerować używając metody setToValue()
. Przykład podany był w pliku Matrix001.java
Czy macierz jest zerowa możemy sprawdzić przy użyciu metody:
public boolean isZeroMatrix() { for (int i = 0; i < getRowCount(); i++) { for (int j = 0; j < getColCount(); j++) { if (array[i][j] != 0.0) { return false; } } } return true; }
Macierz jednostkowa
Macierz diagonalną, której wszystkie elementy leżące na tzw. głównej przekątnej są równe 1, a pozostałe są równe 0, nazywana jest macierzą jednostkową:
W algebrze macierzy mnożenie przez macierz jednostkową jest odpowiednikiem mnożenia przez 1.
Macierz możemy uczynić jednostkową używając metody:
public void setToIdentity() throws MatrixException { if (!isSquareMatrix()) { throw new MatrixException("Macierz nie jest kwadratowa"); } for (int i = 0; i < getRowCount(); i++) { for (int j = 0; j < getColCount(); j++) { if (i == j) { array[i][j] = 1.0; } else { array[i][j] = 0.0; } } } }
Sprawdzić, czy macierz jest jednostkowa, możemy przy uzyciu poniższej metody:
public boolean isIdentityMatrix() throws MatrixException { if (!isSquareMatrix()) { throw new MatrixException("Macierz nie jest kwadratowa"); } for (int i = 0; i < getRowCount(); i++) { for (int j = 0; j < getColCount(); j++) { if ((i != j) && (array[i][j] != 0)) { return false; } else if ((i == j) && (array[i][j] != 1)) { return false; } } } return true; }
Klasa Matrix008.java
1 package matrices2; 2 3 import matrices.Matrix; 4 import matrices.MatrixException; 5 6 public class Matrix008 { 7 public static void main(String[] args) { 8 Matrix matrix = new Matrix(3, 3); 9 try { 10 matrix.setToIdentity(); 11 } catch (MatrixException e) { 12 e.printStackTrace(); 13 } 14 matrix.printToConsole(); 15 try { 16 System.out.println(matrix.isIdentityMatrix()); 17 } catch (MatrixException e) { 18 e.printStackTrace(); 19 } 20 } 21 } 22
Po uruchomieniu klasy na konsoli zobaczymy:
1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 true
Macierz elementarna
Zostanie omówiona w oddzielnym wpisie.
Macierze przekształceń elementarnych
Zostaną omówione w oddzielnym wpisie.
Macierz wierszowa
Macierz , która posiada tylko jeden wiersz jest nazywana macierzą wierszową albo wektorem wierszowym:
Przy użyciu poniższej metody można sprawdzić czy badana macierz jest macierzą wierszową:
public boolean isRowMatrix() { return getRowCount() == 1; }
Macierz kolumnowa
Macierz , która ma tylko jedną kolumnę nazywana jest macierzą kolumnową albo wektorem kolumnowym:
Przy użyciu poniższej metody możemy sprawdzić czy macierz jest macierzą kolumnową:
public boolean isColumnMatrix() { return getColCount() == 1; }
Macierz diagonalna
Macierz diagonalna to macierz kwadratowa, której wszystkie elementy, poza elementami leżącymi na przekątnej, są równe 0.
Taką macierz można też zapisać jako:
Właściwości macierzy diagonalnych
- Suma macierzy diagonalnych jest macierzą diagonalną
- Iloczyn macierzy diagonalnych jest macierzą diagonalną
- Podniesienie każdego z elementów diagonalnych do potęgi n oznacza podniesienie całej macierzy do tej potęgi
- Wyznacznik macierzy diagonalnej jest iloczynem elementów diagonalnych
- Jeżeli wyznacznik macierzy jest odwracalny, to macierz jest nieosobliwa
- Macierz jest odwracalna jeśli każdy jej element jest odwracalny. Macierz odwracamy przez odwrócenie każdego jej elementu
Ad. 2
Ad. 3
Ad. 4
Ad. 6
Metody
Aby sprawdzić czy macierz jest diagonalna możemy użyć metody:
public boolean isDiagonalMatrix() throws MatrixException { if (!isSquareMatrix()) { throw new MatrixException("Macierz nie jest kwadratowa"); } for (int i = 0; i < getRowCount(); i++) { for (int j = 0; j < getColCount(); j++) { if ((array[i][j] != 0.0) && (i != j)) { return false; } } } return true; }
Elementy leżące na przekątnej możemy pobrać do tablicy przy użyciu metody:
public double[] getDiagonal() throws MatrixException { if (!isSquareMatrix()) { throw new MatrixException("Macierz nie jest kwadratowa"); } int len = getRowCount(); double[] diagonals = new double[len]; for (int i = 0; i < getRowCount(); i++) { for (int j = 0; j < getColCount(); j++) { if (i == j) { diagonals[i] = getArray()[i][j]; } } } return diagonals; }
Macierz skalarna
Jest macierzą diagonalną, której każdy element jest wartością skalarną α.
Jeżeli
Jest iloczynem macierzy jednostkowej I przez skalar:
Czy macierz jest skalarna możemy sprawdzić przy użyciu metody:
public boolean isScalarMatrix() throws MatrixException { if (!isSquareMatrix()) { throw new MatrixException("Macierz nie jest kwadratowa"); } double[] diagonals = getDiagonal(); double first = diagonals[0]; for (int i = 1; i < diagonals.length; i++) { if (diagonals[i] != first) { return false; } } return true; }
Macierz symetryczna
Macierz symetryczna to macierz, której elementy rozmieszczone symetrycznie po obu stronach przekątnej głównej są równe, czyli
Przy transpozycji (opowiem o niej oddzielnie) otrzymujemy tę samą macierz:
Czy macierz jest symetryczna można sprawdzić przy użyciu metody:
public boolean isSymmetricMatrix() throws MatrixException { if (!isSquareMatrix()) { throw new MatrixException("Macierz nie jest kwadratowa"); } for (int i = 0; i < getRowCount(); i++) { for (int j = 0; j < getColCount(); j++) { if (array[i][j] != array[j][i]) { return false; } } } return true; }
Macierz antysymetryczna
Macierz antysymetryczna to taka macierz, w której elementy rozmieszczone symetrycznie po obu stronach przekątnej głównej są przeciwne (mają przeciwne znaki), czyli:
Z warunku wynika, że elementy diagonalne muszą być równe 0.
W procesie transpozycji
Czy macierz jest antysymetryczna można sprawdzić przy użyciu metody:
public boolean isAntisymmetricMatrix() throws MatrixException { if (!isSquareMatrix()) { throw new MatrixException("Macierz nie jest kwadratowa"); } for (int i = 0; i < getRowCount(); i++) { for (int j = 0; j < getColCount(); j++) { if (array[i][j] != -array[j][i]) { return false; } } } return true; }
Macierz trójdiagonalna
Macierz jest trójdiagonalna jeżeli wszystkie elementy macierzy leżące poza główną przekątną i dwiema przylegającymi do niej przekątnymi są zerowe.
Czy macierz jest trójdiagonalna można sprawdzić przy użyciu poniższej metody:
public boolean is3DiagonalMatrix() throws MatrixException { if (!isSquareMatrix()) { throw new MatrixException("Macierz nie jest kwadratowa"); } for (int i = 0; i <getRowCount(); i++) { for (int j = 0; j < getColCount(); j++) { if ((array[i][j] == 0.0) && !(Math.abs(i - j) > 1)) { return false; } } } return true; }
Macierz górnotrójkątna
Macierz górnotrójkątna to macierz, której elementy leżące poniżej przekątnej głównej są zerowe.
Macierz wynikowa z pomnożenia przez siebie 2 macierzy górnotrójkątnych jest macierzą górnotrójkątną.
Czy macierz jest górnotrójkątna można sprawdzic przy użyciu poniższej metody:
public boolean isUpperTriangleMatrix() throws MatrixException { if (!isSquareMatrix()) { throw new MatrixException("Macierz nie jest kwadratowa"); } for (int i = 0; i < getRowCount(); i++) { for (int j = 0; j < getColCount(); j++) { if ((i > j) && (array[i][j] != 0)) { return false; } } } return true; }
Macierz dolnotrójkątna
Macierz dolnotrójkątna to macierz, której elementy leżące powyżej przekątnej głównej są zerowe.
Macierz wynikowa z pomnożenia przez siebie 2 macierzy dolnotrójkątnych jest macierzą dolnotrójkątną.
Czy macierz jest dolnotrójkątna możemy sprawdzić przy użyciu poniższej metody:
public boolean isLowerTriangleMatrix() throws MatrixException { if (!isSquareMatrix()) { throw new MatrixException("Macierz nie jest kwadratowa"); } for (int i = 0; i < getRowCount(); i++) { for (int j = 0; j < getColCount(); j++) { if ((i < j) && (array[i][j] != 0)) { return false; } } } return true; }
Podmacierz
Podmacierz to macierz powstała z macierzy przez usunięcie z niej dowolnej liczby wierszy i/lub kolumn niekoniecznie do siebie przylegających. Indeksy podmacierzy zaczynają się od 1.
Macierz
Podmacierz
Metody
Podmacierz możemy znaleźć używając metod:
public static Matrix submatrix(Matrix matrix, int row, int col) { Matrix mat1 = deleteRow(matrix, row); return deleteCol(mat1, col); } // w tablicach podane są indeksy kolumn do usunięcia public static Matrix submatrix(Matrix matrix, int[] rows, int[] cols) { Matrix mat = null; try { mat = matrix.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } int ii = 0; for (int row : rows) { mat = deleteRow(matrix, row - ii); ii++; } int jj = 0; for (int col : cols) { mat = deleteCol(mat, col - jj); jj++; } return mat; } //pobiera podmacierz składającą się z podanej liczby rzędów i kolumn //bezpośrednio do siebie przylegających public static Matrix submatrix(Matrix matrix, int startRow, int endRow, int startCol, int endCol) { int len1 = endRow - startRow + 1; int len2 = endCol - startCol + 1; int len = len1 * len2; double[] ar = new double[len]; int k = 0; for (int i = startRow; i <endRow + 1; i++) { for (int j = startCol; j < endCol + 1; j++) { ar[k] = matrix.getArray()[i][j]; k++; } } return new Matrix(ar, len2); }
Przykłady
Klasa Matrix019.java
Z podanej macierzy usuwamy 3 wiersz i kolumnę.
double[][] array = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; Matrix matrix = new Matrix(array); matrix.printToConsole(); Util.print(""); Matrix matrix1 = MatrixUtil.submatrix(matrix, 2, 2); matrix1.printToConsole();
Po uruchomieniu klasy na konsoli zobaczymy:
1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 1.0 2.0 4.0 5.0
Klasa Matrix028.java
double[] array1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36}; Matrix matrix1 = new Matrix(array1, 6); matrix1.printToConsole(); Matrix matrix2 = MatrixUtil.submatrix(matrix1, 2, 4, 2, 4); matrix2.printToConsole();
Z macierzy
wybieramy podmacierz: 3, 4 i 5 rząd oraz 3, 4 i 5 kolumna. Otrzymujemy podmacierz:
Klasa Matrix055.java
double[][] arr = {{1, 2, 3, 4, 5}, {2, 3, 4, 5, 6}, {3, 4, 5, 6, 7}, {4, 5, 6, 7, 8}}; Matrix mat = new Matrix(arr); mat.printToConsole(); System.out.println(); Matrix mat1 = MatrixUtil.submatrix(mat, new int[]{1}, new int[]{1, 3}); mat1.printToConsole();
Z macierzy
Usuwamy rząd 2 oraz kolumny 2 i 4. Otrzymujemy podmacierz:
Podmacierz główna
Podmacierz główna, to taka podmacierz, która jeśli zawiera elementy i-tego wiersza macierzy wyjściowej to zawiera również elementy i-tej kolumny tej macierzy.
Macierz:
Podmacierz główna (zawiera elementy drugiego wiersza i drugiej kolumny):
Podmacierzą główną jest również każdy z elementów leżących na przekątnej głównej.
Macierz transponowana
Zostanie omówiona w rozdziale 'Transpozycja macierzy’.
Macierz odwrotna
Zostanie omówiona w rozdziale 'Odwracanie macierzy’.
Macierz osobliwa
Jeżeli wyznacznik macierzy równa się zeru to macierz nie ma odwrotności (jest nieodwracalna) i nazywana jest macierzą osobliwą.
Osobliwość macierzy możemy sprawdzić używając metody:
public boolean isSingularMatrix() { double det = 0.0; try { det = det(); } catch (MatrixException e) { e.printStackTrace(); } return det == 0; }
Klasa Matrix024.java
double[] array = {2, 3, 1, 1.5}; Matrix matrix = new Matrix(array, 2); matrix.printToConsole(); try { System.out.println("det: " + matrix.det()); } catch (MatrixException e) { e.printStackTrace(); } System.out.println("czy jest osobliwa?: " + matrix.isSingularMatrix());
Sprawdzamy, czy powyższa macierz jest osobliwa. Po uruchomieniu klasy na konsoli zobaczymy:
2.0 3.0 1.0 1.5 det: 0.0 czy jest osobliwa?: true
Macierz nieosobliwa
Jeżeli wyznacznik macierzy jest różny od zera to macierz ma odwrotność (jest odwracalna) i nazywana jest macierzą nieosobliwą.
Klasa Matrix025.java
Testujemy osobliwość macierzy.
double[] array = {2, 3, 1, 3}; Matrix matrix = new Matrix(array, 2); matrix.printToConsole(); try { System.out.println("det: " + matrix.det()); } catch (MatrixException e) { e.printStackTrace(); } System.out.println("czy jest osobliwa?: " + matrix.isSingularMatrix());
Po uruchomieniu klasy na konsoli zobaczymy:
2.0 3.0 1.0 3.0 det: 3.0 czy jest osobliwa?: false
Macierz schodkowa
Macierz schodkowa to macierz, w której wiersze zerowe (jeśli występują) znajdują się najniżej, a w wierszach niezerowych, pierwsze niezerowe elementy, kolejnych niezerowych wierszy, znajdują się w coraz dalszych kolumnach.
Macierz schodkowa zredukowana
Macierz schodkowa zredukowana to macierz, która:
- jest schodkowa
- w każdym wierszu niezerowym, pierwszy niezerowy wyraz jest równy 1, a pod nim (w kolumnie) występują wyłącznie zera
Macierz kwadratowa, w postaci schodkowej zredukowanej jest zawsze macierzą górnotrójkątną.
Macierz ortogonalna
Macierz kwadratowa A jest nazywana macierzą ortogonalną, jeśli macierz transponowana macierzy A pomnożona przez macierz daje w wyniku macierz jednostkową:
Z tego wynika, że:
Wyznacznik macierzy ortogonalnej jest równy 1 albo -1.
Mamy macierz:
Klasa Matrix078.java
double[][] A = {{1, 0}, {0, -1}}; Matrix m = new Matrix(A); m.printToConsole(); Util.print(""); Matrix m1 = MatrixUtil.transpose(m); m1.printToConsole(); Util.print(""); Matrix m2 = MatrixUtil.multiply3(m1, m); m2.printToConsole(); Util.print(""); Matrix m3 = MatrixUtil.inverseGauss(m); m3.printToConsole(); Util.print("");
Po uruchomieniu klasy na konsoli otrzymujemy:
1.0 0.0 0.0 -1.0 1.0 0.0 0.0 -1.0 1.0 0.0 0.0 1.0 1.0 0.0 0.0 -1.0
Macierz blokowa
Omówiono w podrozdziale poświęconym partycjonowaniu macierzy.
Macierz nilpotentna
Macierz nilpotentna, to macierz kwadratowa, która podniesiona do pewnej potęgi n (gdzie n jest liczbą całkowitą dodatnią) jest macierzą zerową:
Najniższe n, które spełnia powyższą równość nazywane jest indeksem n.
Macierz A jest macierzą nilpotentną o indeksie n=3.
Przykład w klasie Matrix086.java
w załączonych plikach.
Pliki do ściągnięcia
Moduł matrices – aktualny stan projektu = 002;