[[oktatas:programozás:algoritmusok|< Algoritmusok]] ====== Műveletek mátrixokkal ====== * **Szerző:** Sallai András * Copyright (c) 2014, Sallai András * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC BY-SA 4.0]] * Web: https://szit.hu ===== A mátrixokról ===== A mátrixok tulajdonképpen számok téglalap alakú tömbjei. A mátrixokkal való műveletvégzés a tudományos számítások alapjai. ===== Fogalmak ===== ==== Meghatározás ==== Számok táblázatos formában, amelynek n darab sora és m darab oszlopa van. ==== Példák ==== A = delim{[}{ matrix{2}{2} { 2 3 5 1 } }{]} B = delim{[}{ matrix{3}{3} { 2 4 1 2 1 0 {-2} 2 1 } }{]} C = delim{[}{ matrix{4}{4} { 2 4 1 {-1} 2 1 0 4 {-2} 2 1 5 3 1 0 2 } }{]} 3x4 mátrix: D = delim{[}{ matrix{3}{4} { 2 4 1 {-1} 2 1 0 4 {-2} 2 1 5 } }{]} Szögletes zárójelek helyett lehet szimpla zárójel is. D = ( matrix{3}{4} { 2 4 1 {-1} 2 1 0 4 {-2} 2 1 5 } ) ==== Mátrix indexekkel ==== A mátrixban minden elemre tudunk hivatkozni az indexük alapján. Az első index a sor jelöli, a második az oszlopot. delim{[}{ matrix{3}{3} {2_{11} 1_{12} 3_{13} 2_{21} 1_{22} 3_{23} 0_{31} 1_{32} 2_{33}} }{]} A a_{13} azt jelenti, az első sor, harmadik eleme. Ha általánosan valamelyik elemre hivatkozunk akkor szokásos forma: a_{ij}. Ahol i sor, j az oszlop. ==== Főátló ==== A főátlót azok az elem alkotják, amelyek sor- és oszlopindexei azonosak. delim{[}{ matrix{3}{3} { 8_{11} {-2_{12}} 2_{13} 3_{21} 5_{22} 2_{23} 0_{31} 0_{32} 3_{33}} }{]} A fenti mátrixban főátlót a 8 5 és 3-as értékek alkotják, amelyeknek az indexe rendre: 11, 22, 33. ===== Determináns ===== ==== A determinánsról ==== Minden mátrixhoz hozzárendelhető egy szám, amelyet determinánsnak nevezünk. Ha a determináns 0, akkor szinguláris mátrixról beszélünk. Ha determináns nem 0, akkor reguláris mátrixról beszélünk. ==== 2x2-s mátrix ==== A determinánst számítása 2x2 mátrixban: * veszem a fő átló elemeinek szorzatát * veszem a másik átló elemeinek szorzatát * a két szorzat különbsége a determináns A determináns jelölése: |A| vagy: det(A) Legyen egy 2x2-es mátrix: delim{|} { matrix{2}{2} {2 1 3 4} } {|} = 2*4 - 3*1 = 5 ==== Kifejtési tétel ==== Ha kvadratikus mátrix mérete nagyobb mint 2, a determináns számítása másként történik. A kifejtéshez ki kell választani egy sort vagy egy oszlopot. Bármely sor vagy oszlop alapján meghatározható a determináns. Legyen a példa kedvéért a következő mátrix: ( matrix{3}{3} { 2 3 0 4 5 1 6 8 9} ) A bal felső sarkot jelöljük meg "+" jellel. Ez után sakktábla-szerűen a többit is: {{:oktatas:programozás:algoritmusok:matrix_det_00.png|}} Vegyük a kifejtéshez az első oszlopot: 2, 4, 6. {{:oktatas:programozás:algoritmusok:matrix_det_01.png|}} Jelöljük meg közülük az elsőt, azaz a 2-t. A 2-vel azonos sorban és oszlopban lévő elemekkel nem foglalkozunk. Így marad egy 2x2-es mátrix: {{:oktatas:programozás:algoritmusok:matrix_det_02.png|}} matrix{2}{2} { 5 1 8 9} Ennek kiszámítjuk a determinánsát a 2x2 nagyságú mátrix esetén tanultak alapján. delim{|} { matrix{2}{2} { 5 1 8 9 } } {|} = 5 * 9 - 8 * 1 = 37 Írjuk fel a fentebb kiválasztott 2-es számot és ezt a 37-es eredményt szorzatként: 2 * 37 Vegyük az oszlop következő elemét, ami 4. A 4-gyel azonos sorokkal és oszlopokkal most nem foglalkozunk. A megmaradt elemek egy megint egy 2x2-es mátrixot alkotnak, aminek kiszámítjuk a determinánsát. {{:oktatas:programozás:algoritmusok:matrix_det_03.png|}} delim{|} { matrix{2}{2} { 3 0 8 9 } } {|} = 3 * 9 - 0 = 27 A 2 * 37 szorzathoz hozzáadjuk az újabbat: (2 * 37) + (-4 * 27) A táblázatból látjuk, hogy a 4-es érték negatívan számít. Vegyük az oszlop utolsó elemét, amely a 6. A hozzátartozó sor és oszlop elemeivel itt sem foglalkozunk: {{:oktatas:programozás:algoritmusok:matrix_det_04.png|}} Kiszámítjuk a megmaradt 2x2-es mátrix determinánsát: delim{|} { matrix{2}{2} { 3 0 5 1 } } {|} = 3 * 1 - 0 = 3 A fenti szorzatunkhoz hozzáadjuk a 6 * 3 szorzatot. A 6 itt is az oszlop utolsó eleme, a 27 pedig az utóbbi 2x2-es mátrix determinánsa. A szorzatunk végül: (2 * 37) + (4 * 27) + (6 * 3) Kiszámítva megkapjuk a determinánst: (2 * 37) + (-4 * 27) + (6 * 3) = -16 A 3x3-as mátrixunk determináns számítás eredménye ezek után így írható fel: delim{|}{ matrix{3}{3} { 2 3 0 4 5 1 6 8 9} } {|} = -16 ==== 4x4-s mátrix ==== A 4x4-s mátrixot úgy kezdjük mint a 3x3 méret esetén, de most négy oszloppal és sorral számolok. Az elsőként kiválasztott elem esetén, a kiválasztott elemhez tartozó sorok és oszlopokon kívül eső rész nem 2x2-s mátrix, helyette 3x3. A 3x3-as mátrix determinánsát a kifejtési tétellel számoljuk, mint azt az előbb láttuk. {{:oktatas:programozás:algoritmusok:matrix_det_05.png|}} Így járok el a többi sor és oszlop esetén is. ==== Java megvalósítás ==== //Determináns számítása: static double det(double[][] a, int n) { double d = 1; for(int k=0; k ===== Mátrix típusok ===== ==== Skalármátrix ==== 1x1 dimenziós mátrix. Valójában egy szimpla szám. delim{[}{ matrix{1}{1} {5} }{]} ==== Oszlopmátrix ==== delim{[}{ matrix{4}{1} { a_{11} vdots vdots a_{n1} } }{]} ==== Sormátrix ==== delim{[}{ matrix{1}{4} { a_11 a_12 cdots a_1m } }{]} ==== Négyzetes mátrix ==== Másként kvadratikus mátrix. A mátrix //n x n// elemből áll. delim{[}{ matrix{4}{4} { a_11 a_12 cdots a_{1n} vdots ddots { } vdots vdots { } ddots vdots a_{n1} cdots cdots a_{nn} } }{]} ==== Nullmátrix ==== A nullmátrix minden eleme 0. delim{[}{ matrix{3}{3} {0 0 0 0 0 0 0 0 0} }{]} ==== Egységmátrix ==== A főátlóban 1-es értékek vannak, a többi 0. delim{[}{ matrix{4}{4} {1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1} }{]} ==== Felső háromszögmátrix ==== Az átló alatt 0 értékek. delim{[}{ matrix{4}{4} {4 2 1 2 0 3 3 2 0 0 1 5 0 0 0 2} }{]} ==== Alsó háromszögmátrix ==== Az átló fölött nulla értékek. delim{[}{ matrix{4}{4} {2 0 0 0 3 4 0 0 2 1 3 0 4 2 1 3} }{]} ==== Diagonális mátrix ==== A főátlón kívül minden elem 0; delim{[}{ matrix{4}{4} {2 0 0 0 0 4 0 0 0 0 3 0 0 0 0 3} }{]} ===== Mátrix transzponáltja ===== ==== Transzponálás ==== A transzponálás a sorok és oszlopok felcserélése. {{http://upload.wikimedia.org/wikipedia/commons/e/e4/Matrix_transpose.gif}} (matrix {2}{3}{ 1 2 3 4 5 6 }) = (matrix {3}{2}{ 1 4 2 5 3 6 })^T ^ a mátrix (kiindulási táblázat) ^^^^ | 5 | 2 | 3 | 4 | | 0 | 1 | 4 | 5 | | 3 | 2 | 0 | 6 | A transzponáltja: ^ b mátrix (a transzponált) ^^^ | 5 | 0 | 3 | | 2 | 1 | 2 | | 3 | 4 | 0 | | 4 | 5 | 6 | ==== Java megvalósítás ==== class Program01 { static int[][] a = { {5, 2, 3, 4}, {0, 1, 4, 5}, {3, 2, 0, 6}}; static int[][] b = new int[4][3]; public static void transzponal() { for(int i=0; i<3; i++) { for(int j=0; j<4; j++) { b[j][i] = a[i][j]; } } } public static void kiir(int sor, int oszlop, int[][] matrix) { for(int i=0; i Eredmény: 5 2 3 4 0 1 4 5 3 2 0 6 ------------ 5 0 3 2 1 2 3 4 0 4 5 6 ===== Mátrix szorzata ===== ==== Szorzás ==== Meg kell vizsgálnunk a szorzás elvégezhető-e. A következő nagyságú mátrixok szorozhatók: n * k és k * m Ahol n*k az első mátrix méretei, és k*m a másik mátrix méretei. A két mátrix akkor szorozható, ha k méreteik megegyeznek. Az összeszorzott mátrix mérete: n * m lesz. n * k és k * m eredmény: n * m Mátrix műveletek * Nem kommutatív a szorzásra nézve-> A * B != B * A * Asszociatív -> (A * B) * C = A * (B * C) ==== Mátrixok szorzása ==== {{:oktatas:programozás:algoritmusok:matrixszorzasa.png?300|}} ^ a mátrix ^^ | 1 | 2 | | 3 | 4 | ^ b mátrix ^^^ | 10 | 20 | 30 | | 40 | 50 | 60 | ^ a * b eredménye ^^^ | 90 | 120 | 150 | | 190 | 260 | 330 | ==== Megvalósítás Java nyelven ==== class Program01 { static int[][] a = { {1, 2}, {3, 4} }; static int[][] b = { {10, 20, 30}, {40, 50, 60} }; static int[][] c = new int[2][3]; public static void szoroz() { int m = 2, n = 2, k = 3; //m-oszlop, n-sor (k-oszlop) int sum=0; for (int i = 0 ; i < n ; i++ ) { for (int j = 0 ; j < k ; j++ ) { for (int p = 0 ; p < m ; p++ ) { sum = sum + a[i][p] * b[p][j]; } c[i][j] = sum; sum = 0; } } } public static void kiir(int sor, int oszlop, int[][] matrix) { for(int i=0; i Eredmény: 1 2 3 4 ------------ 10 20 30 40 50 60 ------------ 90 120 150 190 260 330 ===== Mátrix inverze ===== ==== Az invertálásról ==== Keressük azt a mátrixot, amelyet megszorozva az eredeti mátrixot, az egységmátrixot kapjuk. {{:oktatas:programozás:algoritmusok:matrixinvertalas.png?300|}} Az eredmények közönséges törtként: {{:oktatas:programozás:algoritmusok:matrixinvertalaseredmennyel.png?300|}} Az eredmények tizedestörtként: {{:oktatas:programozás:algoritmusok:matrixinvertalaseredmennyel_2.png?300|}} ==== Invertálás Gauss–Jordan-eliminációval ==== Legyen A mátrix. Keressük az inverzét, amit így jelölünk: A-1 A = (matrix{2}{2} { 2 1 3 4 }) Egy mátrix nem invertálható ha a determinánsa 0. Ezért számítsuk ki a determinánst: det A = 2 * 4 - 3 * 1 = 5 ≠ 0 Nem nulla, így a mátrix invertálható. Leírjuk az A mátrixot és mellé az E egységmátrixot: [A|E] ( matrix{2}{4} { 2 1 1 0 3 4 0 1 } ) Osztjuk az első sort 2-vel: (matrix{2}{4} { 1 {1/2} {1/2} 0 3 4 0 1 }) Hozzáadjuk a második sorhoz az első -3 szorosát: (matrix{2}{4} { 1 {1/2} {1/2} 0 0 {5/2} {-3/2} 1 }) Osztjuk a második sort 5/2-vel: (matrix{2}{4} { 1 {1/2} {1/2} 0 0 1 {-3/5} {2/5} }) Hozzáadjuk az első sorhoz, második sor -1/2 szeresét: (matrix{2}{4} { 1 0 {4/5} {-1/5} 0 1 {-3/5} {2/5} }) Az eredmény: A-1 = (matrix{2}{2} { {4/5} {-1/5} {-3/5} {2/5} }) ==== Java Megvalósítás ==== import java.util.Scanner; class Program01 { public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.println("Mátrix invertálása"); System.out.print("Mátrix mérete: "); int size = in.nextInt(); double[][] a = new double[size][size+size]; //Az egységmátrix elkészítése for (int i = 0; i < size; i++) { for (int j = 0; j < size+size; j++) { if (j == i + size) { a[i][j] = 1; } else { a[i][j] = 0; } } } //Mátrix bekérése System.out.printf("\nÍrd be a %d X %d mátrixot:\n", size, size); for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { a[i][j] = in.nextDouble(); } } if(det(a, size)==0) { System.out.println("Nem invertálható, mert a determinánsa 0"); }else { inverz(a, size); kiir(a, size); } } //Determináns számítása: static double det(double[][] a, int n) { double d = 1; for(int k=0; k ===== Függelék ===== ==== Mátrix invertálás példa ==== ^ mátrix ^^^ | 7 | 1 | 1 | | 1 | 3 | 2 | | 6 | 4 | 1 | Gauss-Jordan elimináció ^ Hozzáadjuk az egységmátrixot ^^^^^^ | 7 | 1 | 1 | 1 | 0 | 0 | | 1 | 3 | 2 | 0 | 1 | 0 | | 6 | 4 | 1 | 0 | 0 | 1 | Az első sort osztom 7-tel: ^ 1sor = 1sor/7 ^^^^^^ | 1 | 1/7 | 1/7 | 1/7 | 0 | 0 | | 1 | 3 | 2 | 0 | 1 | 0 | | 6 | 4 | 1 | 0 | 0 | 1 | Hozzáadjuk a kettes sorhoz az első sor -1 szeresét: ^ 2sor = 1sor * -1 + 2sor ^^^^^^ | 1 | 1/7 | 1/7 | 1/7 | 0 | 0 | | 0 | 20/7 | 13/7 | -1/7 | 1 | 0 | | 6 | 4 | 1 | 0 | 0 | 1 | ^ 3sor = 1sor * -6 + 3sor ^^^^^^ | 1 | 1/7 | 1/7 | 1/7 | 0 | 0 | | 0 | 20/7 | 13/7 | -1/7 | 1 | 0 | | 0 | 22/7 | 1/7 | -6/7 | 0 | 1 | ^ 2sor = 2sor : 20/7 ^^^^^^ | 1 | 1/7 | 1/7 | 1/7 | 0 | 0 | | 0 | 1 | 13/20 | -1/20 | 7/20 | 0 | | 0 | 22/7 | 1/7 | -6/7 | 0 | 1 | ^ 3sor = 2sor * -22/7 + 3sor ^^^^^^ | 1 | 1/7 | 1/7 | 1/7 | 0 | 0 | | 0 | 1 | 13/20 | -1/20 | 7/20 | 0 | | 0 | 0 | -19/10 | -7/10 | -11/10 | 1 | ^ 3sor = 3sor : -19/10 ^^^^^^ | 1 | 1/7 | 1/7 | 1/7 | 0 | 0 | | 0 | 1 | 13/20 | -1/20 | 7/20 | 0 | | 0 | 0 | 1 | 7/19 | 11/19 | -10/19 | ^ 2sor = 3sor * -13/20 + 2sor ^^^^^^ | 1 | 1/7 | 1/7 | 1/7 | 0 | 0 | | 0 | 1 | 0 | -11/38 | -1/38 | 13/38 | | 0 | 0 | 1 | 7/19 | 11/19 | -10/19 | ^ 1sor = 3sor * -1/7 + 1sor ^^^^^^ | 1 | 1/7 | 0 | 12/133 | -11/133 | 10/133 | | 0 | 1 | 0 | -11/38 | -1/38 | 13/38 | | 0 | 0 | 1 | 7/19 | 11/19 | -10/19 | ^ 1sor = 2sor * -1/7 + 1sor ^^^^^^ | 1 | 0 | 0 | 5/38 | -3/38 | 1/38 | | 0 | 1 | 0 | -11/38 | -1/38 | 13/38 | | 0 | 0 | 1 | 7/19 | 11/19 | -10/19 | A mátrix inverze: ^ Eredmény ^^^ | 5/38 | -3/38 | 1/38 | | -11/38 | -1/38 | 13/38 | | 7/19 | 11/19 | -10/19 | ==== Mátrix invertálás példa 2 ==== ^ mátrix ^^ | 1 | 2 | | 3 | 4 | Gauss-Jordan elimináció ^ Hozzáadjuk az egységmátrixot ^^^^ | 1 | 2 | 1 | 0 | | 3 | 4 | 0 | 1 | ^ 2sor = (1sor * -3) + 2sor ^^^^ | 1 | 2 | 1 | 0 | | 0 | -2 | -3 | 1 | A második sort osztom -2-vel: ^ 2sor = 2sor : -2 ^^^^ | 1 | 2 | 1 | 0 | | 0 | 1 | 3/2 | -1/2 | ^ 1sor = (2sor * -2) + 1 ^^^^ | 1 | 0 | -2 | 1 | | 0 | 1 | 3/2 | -1/2 | ^ Eredmény ^^ | -2 | 1 | | 3/2 | -1/2 | ==== Mátrix invertálás példa 3 ==== ^ mátrix ^^ | 5 | 2 | | 3 | 6 | Gauss-Jordan elimináció ^ Hozzáadjuk az egységmátrixot ^^^^ | 5 | 2 | 1 | 0 | | 3 | 6 | 0 | 1 | ^ 1sor = 1sor : 5 ^^^^ | 1 | 2/5 | 1/5 | 0 | | 3 | 6 | 0 | 1 | ^ 2sor = (1sor * -3) + 2sor ^^^^ | 1 | 2/5 | 1/5 | 0 | | 0 | 24/5 | -3/5 | 1 | ^ 2sor = 2sor : 24/5 ^^^^ | 1 | 2/5 | 1/5 | 0 | | 0 | 1 | -1/8 | 5/24 | ^ 1sor = (2sor * -2/5) + 1sor ^^^^ | 1 | 0 | 1/4 | -1/12 | | 0 | 1 | -1/8 | 5/24 | ^ Eredmény ^^ | 1/4 | -1/12 | | -1/8 | 5/24 |