• Nem Talált Eredményt

fejezet - Numerikus műveletek mátrixokkal (szerző: Hernyák Zoltán)

Hernyák Zoltán)

10. fejezet - Numerikus műveletek mátrixokkal (szerző: Hernyák Zoltán)

Az előző fejezetben több mint 20 módszert vettünk mátrixok feltöltésére. Ezen fejezetben a kiindulási alap, hogy egy vagy két, akár különböző méretű mátrixunk valamilyen módon fel van töltve elemekkel. Javasolt fájlból feltölteni, mert úgy könnyen módosíthatóak a mátrix értékei, és könnyű újra futtatni a programot egy hibás működés felfedezése és a javítás után. De a véletlen értékekkel történő feltöltés is megfelelő lehet. A mátrixot feltöltése után mindig írassuk ki a képernyőre táblázatos alakban, hogy lássuk a feltöltés működését!

A feltöltött mátrixokkal kapcsolatosan sok érdekes és kevésbé érdekes matematikai, numerikus jellegű probléma oldható meg. Ezen alapvető mátrixműveletekre sok programozási probléma vezethető vissza, ezért érdemes őket elkészíteni. A megoldás során a ciklusok gyakorlására is lehetőségünk van.

Bevezető információk: Amennyiben egy A ( méretű) mátrix elemeit tükrözzük a főátlóra, úgy a kapott mátrixot az eredeti A mátrix transzponáltjának nevezzük.

10.1. feladat (Tükrözés a főátlóra – szint: 2). Egy méretű négyzetes mátrixot töltsünk fel véletlen értékekkel, majd jelenítsük meg a képernyőn táblázatos alakban!

Készítsük el ezen mátrix transzponáltját! Készítsük el ezt a programot úgy, hogy két mátrixváltozóval dolgozunk, az eredeti (A) mátrix elemeit nem módosítjuk, a tükrözött értékeket egy második, egyező méretű mátrixba (B) generáljuk le! Jelenítsük meg ezen B mátrixot is a képernyőn táblázatos alakban!

Magyarázat: A megoldáshoz egy egymásba ágyazott (dupla) for ciklus elég. Arra kell csak ügyelni, hogy ne menjen mindkét ciklus -ig, mert ha az a[i,j] cellát felcseréljük az a[j,i] cellával, miközben az i = 2, j

= 3, akkor ne kerüljön ugyanezen cserére sor i = 3, j = 2 értékek esetén is, mert akkor az előző cserét

„visszacseréljük”, végeredményképp a mátrix celláiban az eredeti értékek maradnak, a mátrix változatlan lesz.

10.2. feladat (Tükrözés a mellékátlóra – szint: 3). Egy méretű négyzetes mátrixot töltsünk fel véletlen értékekkel, majd jelenítsük meg a képernyőn táblázatos alakban! Helyben tükrözzük ezt a mátrixot a mellékátlójára, vagyis ne készítsünk el egy második, egyező méretű mátrixot! A tükrözés során az eredeti mátrixban hajtsuk végre a módosításokat! Jelenítsük meg az eredményül kapott értékeket is táblázatos alakban!

Magyarázat: Ez az előző feladathoz nagyon hasonló a feladat, de vagy a ciklusok futási intervallumait kell ügyesebben beállítani, vagy egyfajta transzformációt kell végezni a koordinátákon.

Bevezető információk: Egységmátrixnak nevezzük azt az méretű négyzetes mátrixot, amelynek minden eleme 0, kivéve a főátló elemeit, amelyeknek értéke 1.

10.3. feladat (Egységmátrix készítése – szint: 1). Készítsünk el egy méretű egységmátrixot, ahol N méretét a felhasználó adja meg! A feltöltött mátrixot jelenítsük meg a képernyőn!

Magyarázat: Minden a[i,j] cellába 0 értéket kell helyezni, kivéve ha i==j teljesül (átlóba eső cella), ahova 1-et kell berakni.

10.4. feladat (Egységmátrix-e – szint: 1). Egy méretű mátrixról döntsük el, hogy egységmátrix-e.

Magyarázat: Megoldható a feladat úgy is, hogy generálunk egy méretű egységmátrixot a 10.3 feladatban leírtak szerint, majd meg tudjuk vizsgálni celláról cellára, hogy minden elem egyenlő-e a generált mátrix megfelelő cellájával. Mivel azonban az egységmátrix előállítása nagyon egyszerű szabályok mentén történik, így a vizsgálat során futás közben is generálható az aktuálisan ellenőrzött cella kívánt értéke.

Bevezető információk: Két (A és B) egyforma méretű ( ) mátrixok összegén értsünk egy harmadik C mátrixot, mely szintén méretű, s melynek elemeit úgy kell kiszámítani, hogy az A és B mátrixok egyező koordinátájú celláiban lévő értékeket kell összeadni!

10.5. feladat (Mátrixok összeadása – szint: 2). Legyen két méretű mátrixunk!

Készítsük el a két mátrix összegét! A program jelenítse meg a mátrixokat táblázatos formában – egyszerre csak egy mátrixot –, melyek között a Page Up és Page Down billentyűkkel lehessen lapozni! A program az Esc leütésére lépjen ki!

Magyarázat: A C mátrix esetén a C[i,j] = A[i,j] + B[i,j] képlet segítségével kell módszeresen minden cellát feltölteni. Egy egymásba ágyazott cikluspár elegendő a feladathoz.

10.6. feladat (Mátrix szorzása vektorral – szint: 3). Legyen egy N méretű vektorunk és egy méretű mátrixunk! Készítsük el a vektor és a mátrix szorzatát (M méretű vektor lesz)! A program jelenítse meg a vektort, a mátrixot táblázatos formában, majd az eredményt is! A megjelenítési lehetőségek között a Page Up és Page Down billentyűkkel lehessen lapozni! A program az Esc leütésére lépjen ki!

Magyarázat: A vektor és mátrix szorzása két egymásba ágyazott ciklussal valósítható meg. A vektor minden elemét meg kell szorozni a mátrix megfelelő oszlopában lévő elemekkel (10.4. forráskód) (pl. 2122 = 18 * 23 + 20 * 11 + 16 * 13 + 40 * 32).

10.1. ábra. A C = A * B vektor szorzása mátrixszal – magyarázó ábra

10.1. forráskód. A C=A*B vektor szorzása mátrixal

for(int i=0;i<M;i++) {

// A vektor * B matrix i. soraval int sz = 1;

for(int j=0;j<N;j++) sz = sz*A[i]*B[i,j];

// tarolas C[i]=sz;

}

10.7. feladat (Mátrix szorzása mátrixszal – szint: 4). Legyen egy és egy

méretű mátrixunk! Készítsük el a két mátrix szorzatát ( méretű lesz)! A program jelenítse meg a mátrixokat táblázatos formában, egyszerre csak egy mátrixot, melyek között a Page Up és Page Down billentyűkkel lehessen lapozni! A program az Esc leütésére lépjen ki!

Magyarázat: A mátrixok szorzása három egymásba ágyazott ciklussal valósítható meg. A célmátrix [i,j]

koordinátájú elemét úgy kell kiszámolni, hogy az A mátrix i. sorát kell összeszorozni a B mátrix j. oszlopában szereplő elemekkel.

10.2. ábra. A C = A * B vektor szorzása mátrixszal – magyarázó ábra

Bevezető információk: Egy méretű A mátrix inverzének nevezzük azt az egyező méretű K mátrixot, melyre teljesül az , és ugyanekkor az is, ahol az egységmátrix. Az A mátrix inverz mátrixának jele .

10.8. feladat (Inverzmátrix-ellenőrzés – szint: 3). Olvassunk be egy text fájlból két egyforma méretű A és B kvadratikus mátrixot! Ellenőrizzük le, hogy a B mátrix az A mátrix inverze-e!

Magyarázat: A 10.7 feladatban leírtak szerint kiszámíthatóak a szorzatmátrixok ( és ), és a 10.4 feladatban megadottak szerint eldönthető, hogy egységmátrix-e.

Bevezető információk: Egy A mátrix nyeregpontjának nevezzük azt az elemét, amely a legkisebb a sorában és legnagyobb az oszlopában. Egy mátrixban több nyeregpont is lehet, de elképzelhető, hogy egy sem található.

10.9. feladat (Nyeregpontok – szint: 2). Készítsünk olyan programot, amely egy

méretű mátrix adatait beolvassa fájlból, majd megjeleníti azokat a képernyőn táblázatos formában! A mátrix nyeregpontjait a program színezze be sárgára a táblázatban! A mátrix alatt soroljuk fel a nyeregpontok koordinátáit!

Magyarázat: Amennyiben készítünk egy-egy függvényt, amely képes valamely i. sorban meghatározni a legkisebb elem értékét, valamint egy j. oszlop legnagyobb elemének értékét, úgy (erőforrás-pazarló módon bár) könnyű a nyeregpontokat megtalálni (lásd a 10.5. forráskód).

10.2. forráskód. A nyeregpontok keresése - v1.0 vázlatos

for(int i=0;i<N;i++) {

for(int j=0;j<N;j++) {

if (sorMinimum(i)==oszlopMaximum(j)) nyeregPont(i,j);

} }

Másrészt a 10.5. kódban ugyanazon i. sorbeli minimumot M-szer számoljuk ki, hasonlóan, egy j. oszlopbeli maximumot N-szer számolunk ki. Célszerűbb a minimumokat egyszer kikalkulálni, és egy N elemű, a maximumokat pedig egy M méretű vektorban eltárolni. Később könnyű ezek egyenlőségét még megvizsgálni (10.6. forráskód).

10.3. forráskód. A nyeregpontok keresése - v2.0 vázlatos

for(int i=0;i<N;i++)

minimum[i] = sorMinimum(i);

for(int j=0;j<N;j++)

maximum[j] = oszlopMaximum(j)

// --- for(int i=0;i<N;i++)

{

for(int j=0;j<N;j++) {

if (minimum[i]==maximum[j]) nyeregPont(i,j);

} }

Bevezető információk: Egy A mátrix paritáspontjának nevezzük azt az elemét, amelyre igaz, hogy a sorában lévő elemek összege páros, az oszlopában lévő elemeké pedig páratlan. Hasonlóan a nyeregponthoz, egy mátrixban több paritáspont is létezhet, de előfordulhat, hogy egy sincs benne.

10.10. feladat (Paritáspontok – szint: 2). Készítsünk olyan programot, amely egy

méretű mátrix adatait beolvassa fájlból, majd megjeleníti azokat a képernyőn táblázatos formában! A mátrix paritáspontjait a program színezze be sárgára a táblázatban! Adjuk meg a paritáspontok számát!

Magyarázat: A 10.9-es feladatban leírtaknak megfelelő módon a probléma kezelhető, csak a sorminimum- és oszlopmaximum-függvények helyett a sor- és oszlopösszeg-számító függvényeket kell használni. A számított összegek paritását a kettővel való osztási maradékokból lehet megállapítani. Ha s egy ilyen összeg, akkor az s%2 művelet adja meg a kettővel való osztási maradékot.

1. A fejezet forráskódjai

10.4. forráskód. A C = A * B vektor szorzása mátrixszal

for(int i=0;i<M;i++) {

// A vektor * B matrix i. soraval int sz = 1;

for(int j=0;j<N;j++) sz = sz*A[i]*B[i,j];

// tarolas C[i]=sz;

}

10.5. forráskód. A nyeregpontok keresése – v1.0 vázlatos

for(int i=0;i<N;i++) {

for(int j=0;j<N;j++) {

if (sorMinimum(i)==oszlopMaximum(j)) nyeregPont(i,j);

} }

10.6. forráskód. A nyeregpontok keresése – v2.0 vázlatos

for(int i=0;i<N;i++)

minimum[i] = sorMinimum(i);

for(int j=0;j<N;j++)

maximum[j] = oszlopMaximum(j)

// --- for(int i=0;i<N;i++)

{

for(int j=0;j<N;j++) {

if (minimum[i]==maximum[j]) nyeregPont(i,j);

} }

11. fejezet - Mátrixok vizsgálata