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
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
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
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
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
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
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 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
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
V tejto časti si precvičíme prácu s maticami na niekoľkých praktických úlohách.
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.
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.
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.
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.
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í.