Cvičenie 2 – Matice a operácie

Matice

Vytvorenie matíc

V jazyku R môžeme matice vytvoriť viacerými spôsobmi. Najčastejšie používame funkciu matrix().

# Vytvorenie matice 3x3 s číslami od 11 do 19
A <- matrix(11:19, nrow = 3, ncol = 3)
A
##      [,1] [,2] [,3]
## [1,]   11   14   17
## [2,]   12   15   18
## [3,]   13   16   19
# Vytvorenie matice 2x4 po riadkoch
B <- matrix(seq(5, 12, by = 1), nrow = 2, byrow = TRUE)
B
##      [,1] [,2] [,3] [,4]
## [1,]    5    6    7    8
## [2,]    9   10   11   12

Prístup k prvkom matice

Na prístup ku konkrétnym prvkom používame hranaté zátvorky.

# Prvý riadok druhej matice
B[1, ]
## [1] 5 6 7 8
# Druhý stĺpec prvej matice
A[, 2]
## [1] 14 15 16
# Prvok v druhom riadku a treťom stĺpci
A[2, 3]
## [1] 18

Zmena prvkov v matici

Pomocou indexov môžeme upravovať hodnoty v matici.

# Zmena hodnoty v druhom riadku, treťom stĺpci
A[2, 3] <- 99
A
##      [,1] [,2] [,3]
## [1,]   11   14   17
## [2,]   12   15   99
## [3,]   13   16   19
# Nahradenie prvého riadku novým vektorom
A[1, ] <- c(21, 22, 23)
A
##      [,1] [,2] [,3]
## [1,]   21   22   23
## [2,]   12   15   99
## [3,]   13   16   19

Operácie s maticami

Matice môžeme sčitovať, odčítať, násobiť alebo transponovať.

# Sčítanie matíc rovnakých rozmerov
C <- A + matrix(2, nrow = 3, ncol = 3)
C
##      [,1] [,2] [,3]
## [1,]   23   24   25
## [2,]   14   17  101
## [3,]   15   18   21
# Odčítanie
D <- C - A
D
##      [,1] [,2] [,3]
## [1,]    2    2    2
## [2,]    2    2    2
## [3,]    2    2    2
# Násobenie matíc (matematicky)
E <- A %*% t(B[, 1:3])
E
##      [,1] [,2]
## [1,]  398  662
## [2,]  843 1347
## [3,]  294  486
# Násobenie po prvkoch
F <- A * 2
F
##      [,1] [,2] [,3]
## [1,]   42   44   46
## [2,]   24   30  198
## [3,]   26   32   38

Základné štatistiky a informácie o matici

Pomocou vstavaných funkcií získame základné údaje o matici.

# Rozmery matice
dim(A)
## [1] 3 3
# Počet riadkov a stĺpcov
nrow(A)
## [1] 3
ncol(A)
## [1] 3
# Súčet a priemer všetkých prvkov
sum(A)
## [1] 240
mean(A)
## [1] 26.66667
# Maximálna a minimálna hodnota
max(A)
## [1] 99
min(A)
## [1] 12

Kombinovanie matíc

Matice môžeme spájať po riadkoch alebo stĺpcoch.

# Spojenie po riadkoch
G <- rbind(A, C)
G
##      [,1] [,2] [,3]
## [1,]   21   22   23
## [2,]   12   15   99
## [3,]   13   16   19
## [4,]   23   24   25
## [5,]   14   17  101
## [6,]   15   18   21
# Spojenie po stĺpcoch
H <- cbind(A, D)
H
##      [,1] [,2] [,3] [,4] [,5] [,6]
## [1,]   21   22   23    2    2    2
## [2,]   12   15   99    2    2    2
## [3,]   13   16   19    2    2    2

Vytváranie špeciálnych matíc

R ponúka jednoduché spôsoby vytvárania jednotkových alebo nulových matíc.

# Jednotková matica 3x3
I <- diag(3)
I
##      [,1] [,2] [,3]
## [1,]    1    0    0
## [2,]    0    1    0
## [3,]    0    0    1
# Nulová matica 4x2
J <- matrix(0, nrow = 4, ncol = 2)
J
##      [,1] [,2]
## [1,]    0    0
## [2,]    0    0
## [3,]    0    0
## [4,]    0    0
# Matica s náhodnými číslami
K <- matrix(runif(6, 0, 10), nrow = 2)
K
##          [,1]      [,2]      [,3]
## [1,] 5.485083 4.5621485 1.1867713
## [2,] 6.741253 0.6813936 0.5945311

Transpozícia a inverzia

Transpozícia mení riadky na stĺpce. Inverzia je možná len pre štvorcové matice.

# Transpozícia matice A
t(A)
##      [,1] [,2] [,3]
## [1,]   21   12   13
## [2,]   22   15   16
## [3,]   23   99   19
# Inverzia jednotkovej matice (je rovnaká ako pôvodná)
solve(I)
##      [,1] [,2] [,3]
## [1,]    1    0    0
## [2,]    0    1    0
## [3,]    0    0    1
# Inverzia náhodnej matice 2x2
L <- matrix(c(3, 5, 2, 7), nrow = 2)
solve(L)
##            [,1]       [,2]
## [1,]  0.6363636 -0.1818182
## [2,] -0.4545455  0.2727273

Determinant a hodnosť matice

Tieto operácie sú dôležité pri riešení sústav lineárnych rovníc.

# Determinant matice L
det(L)
## [1] 11
# Hodnosť matice A (pomocou balíka Matrix)
library(Matrix)
rankMatrix(A)
## [1] 3
## attr(,"method")
## [1] "tolNorm2"
## attr(,"useGrad")
## [1] FALSE
## attr(,"tol")
## [1] 6.661338e-16

Malé cvičenie

V tejto časti si precvičíme prácu s maticami na niekoľkých praktických úlohách.

Úloha 1: Základné operácie s maticami

Vytvoríme dve matice 3x3 a vypočítame ich súčet, rozdiel a súčin.

# Vytvorenie dvoch matíc 3x3
M1 <- matrix(c(2, 5, 7, 4, 8, 6, 1, 3, 9), nrow = 3, byrow = TRUE)
M2 <- matrix(c(9, 2, 4, 7, 5, 1, 6, 8, 3), nrow = 3, byrow = TRUE)

M1
##      [,1] [,2] [,3]
## [1,]    2    5    7
## [2,]    4    8    6
## [3,]    1    3    9
M2
##      [,1] [,2] [,3]
## [1,]    9    2    4
## [2,]    7    5    1
## [3,]    6    8    3
# Súčet matíc
sum_mat <- M1 + M2
sum_mat
##      [,1] [,2] [,3]
## [1,]   11    7   11
## [2,]   11   13    7
## [3,]    7   11   12
# Rozdiel matíc
diff_mat <- M1 - M2
diff_mat
##      [,1] [,2] [,3]
## [1,]   -7    3    3
## [2,]   -3    3    5
## [3,]   -5   -5    6
# Matematické násobenie matíc
prod_mat <- M1 %*% M2
prod_mat
##      [,1] [,2] [,3]
## [1,]   95   85   34
## [2,]  128   96   42
## [3,]   84   89   34

➡️ Komentár: Vidíme, že výsledné matice majú rovnaké rozmery. Násobenie %*% vykonáva klasický maticový súčin.


Úloha 2: Determinant a inverzia matice

Zistíme determinant matice M1 a pokúsime sa vypočítať jej inverznú maticu.

# Výpočet determinantov
det_M1 <- det(M1)
det_M1
## [1] -14
# Ak determinant nie je nulový, môžeme nájsť inverznú maticu
if (det_M1 != 0) {
  inv_M1 <- solve(M1)
  inv_M1
} else {
  print("Matica nie je invertovateľná (determinant = 0).")
}
##            [,1]        [,2]       [,3]
## [1,] -3.8571429  1.71428571  1.8571429
## [2,]  2.1428571 -0.78571429 -1.1428571
## [3,] -0.2857143  0.07142857  0.2857143

➡️ Komentár: Ak je determinant rôzny od nuly, matica je regulárna a môžeme ju invertovať. V opačnom prípade nie.


Úloha 3: Spájanie matíc

Spojíme dve matice po stĺpcoch a vypíšeme rozmery novej matice.

# Spojenie matíc po stĺpcoch
combined <- cbind(M1, M2)
combined
##      [,1] [,2] [,3] [,4] [,5] [,6]
## [1,]    2    5    7    9    2    4
## [2,]    4    8    6    7    5    1
## [3,]    1    3    9    6    8    3
# Zistenie rozmerov
dim(combined)
## [1] 3 6

➡️ Komentár: Nová matica má rovnaký počet riadkov ako pôvodné matice, ale dvojnásobný počet stĺpcov.


Úloha 4: Náhodné matice a vyhľadávanie hodnôt

Vytvoríme maticu s náhodnými číslami a zistíme, kde sa nachádza jej najväčšia hodnota.

# Generovanie náhodnej matice 4x4 s hodnotami od 0 do 20
set.seed(123)  # pre reprodukovateľnosť
R <- matrix(runif(16, 0, 20), nrow = 4)
R
##           [,1]     [,2]      [,3]      [,4]
## [1,]  5.751550 18.80935 11.028700 13.551413
## [2,] 15.766103  0.91113  9.132295 11.452668
## [3,]  8.179538 10.56211 19.136667  2.058494
## [4,] 17.660348 17.84838  9.066683 17.996499
# Nájdeme najväčšiu hodnotu
max_val <- max(R)
max_val
## [1] 19.13667
# Zistíme pozíciu tejto hodnoty
max_index <- which(R == max_val, arr.ind = TRUE)
max_index
##      row col
## [1,]   3   3

➡️ Komentár: Funkcia which(..., arr.ind = TRUE) vráti pozíciu (riadok, stĺpec), kde sa daná hodnota nachádza.


Zhrnutie

V tejto časti sme si ukázali: - ako vytvárať a upravovať matice, - základné operácie a štatistiky, - prácu s transpozíciou, inverziou a determinantom.

Matice tvoria základ pre lineárnu algebru a sú veľmi dôležité pri dátovej analýze a modelovaní.