Skaláre, text, logika, vektory, matice a vlastné čísla na príkladoch z basketbalu

Autor

Richard Vladyka
(s pomocou claude.ai)

Publikované

1. septembra 2026

1 Úvod

Tento notebook demonštruje základné operácie v jazyku R s:

  • skalárnymi číslami (t. j. 1 číslo),
  • textovými (znakovými) reťazcami,
  • logickými (boolovskými) hodnotami,
  • numerickými vektormi,
  • maticami,
  • vlastnými číslami a vlastnými vektormi.

Väčšinu ukážok sme postavili na štatistikách z basketbalu (NBA). Hodnoty sú ilustratívne a slúžia len na precvičenie.


2 Skaláre (jednočíselné hodnoty)

2.1 Numerické skaláre

Kód
# Priradenie konštanty do premennej
a <- 24      # napr. body hráča v zápase
b <- 4.5     # napr. asistencie hráča v zápase

# Aritmetika
sum_ab     <- a + b      # súčet
diff_ab    <- a - b      # rozdiel
prod_ab    <- a * b      # násobenie
quot_ab    <- a / b      # delenie
power_ab   <- a ^ b      # umocňovanie
mod_ab     <- a %% 5     # zvyšok po delení piatimi (modulo)
int_div_ab <- a %/% b    # celočíselné delenie

# Zaokrúhľovanie
round_b <- round(b)      # zaokrúhlenie na najbližšie celé číslo
ceil_b  <- ceiling(b)    # najbližšie vyššie celé číslo
floor_b <- floor(b)      # najbližšie nižšie celé číslo

a; b
[1] 24
[1] 4.5
Kód
sum_ab; diff_ab; prod_ab; quot_ab; power_ab; mod_ab; int_div_ab
[1] 28.5
[1] 19.5
[1] 108
[1] 5.333333
[1] 1625364
[1] 4
[1] 5
Kód
round_b; ceil_b; floor_b
[1] 4
[1] 5
[1] 4
TipPoznámky
  • ^ je operátor umocňovania.
  • %% je modulo, teda zvyšok po delení; %/% je celočíselné delenie.
  • round(x, digits = 0) zaokrúhľuje na zadaný počet desatinných miest. R pri hodnote presne uprostred zaokrúhľuje na párne číslo, preto round(4.5) dá 4, ale round(5.5) dá 6.

2.2 Príklad z NBA: úspešnosť streľby

Kód
trojky_trafene <- 9
trojky_pokusy  <- 17

uspesnost_3p <- trojky_trafene / trojky_pokusy * 100
uspesnost_3p
[1] 52.94118
Kód
round(uspesnost_3p, 1)   # zaokrúhlenie na 1 desatinné miesto
[1] 52.9

2.3 Malé cvičenie

Vypočítajte:

\[\frac{(18^2-9)}{5}\]

Kód
(18^2 - 9) / 5
[1] 63

3 Text

3.1 Vytváranie textových premenných a práca s nimi

Kód
meno    <- "Nikola"                         # obsah textovej premennej meno
priezv  <- "Jokic"                          # obsah textovej premennej priezv
cele    <- paste(meno, priezv)              # spojenie s medzerou
bez_med <- paste0(meno, priezv)             # spojenie bez medzery
csv_riadok <- paste("Denver", "Boston", "Miami", sep = ",")  # oddeľovač ","

meno; priezv; cele; bez_med; csv_riadok
[1] "Nikola"
[1] "Jokic"
[1] "Nikola Jokic"
[1] "NikolaJokic"
[1] "Denver,Boston,Miami"

3.2 Dĺžka textového reťazca a podreťazec

Kód
x <- "Triple-double!"
nchar(x)                # počet znakov
[1] 14
Kód
substr(x, 1, 6)         # podreťazec od 1. do 6. znaku
[1] "Triple"
Kód
toupper(x)              # veľké písmená
[1] "TRIPLE-DOUBLE!"
Kód
tolower(x)              # malé písmená
[1] "triple-double!"

3.3 Príklad z NBA: tímové skratky

Kód
tim <- "Golden State Warriors"
skratka <- toupper(substr(tim, 1, 3))
paste("Skratka tímu", tim, "je", skratka)
[1] "Skratka tímu Golden State Warriors je GOL"
Tip

Knižnica stringr ponúka mnoho ďalších možností práce s textom, no základné funkcie R pokrývajú väčšinu bežných potrieb.


4 Logické (boolovské) hodnoty

4.1 Základy

Kód
p <- TRUE     # hráč dal aspoň 20 bodov
q <- FALSE    # hráč mal aspoň 10 asistencií

!p            # NOT
[1] FALSE
Kód
p & q         # AND
[1] FALSE
Kód
p | q         # OR
[1] TRUE
Kód
xor(p, q)     # exclusive OR - platí práve jedno z p, q
[1] TRUE

4.2 Logický výsledok porovnávania

Kód
25 < 30
[1] TRUE
Kód
12 >= 12
[1] TRUE
Kód
"Lakers" == "Lakers"
[1] TRUE
Kód
"Lakers" != "Celtics"   # != znamená "nerovná sa"
[1] TRUE
Kód
!TRUE
[1] FALSE

4.3 Zložitejšie logické operácie

Kód
body <- 27
asistencie <- 11
doskoky <- 4

body > 20 & asistencie > 10      # súčasne (logický prienik)
[1] TRUE
Kód
body > 40 | asistencie > 15      # alebo (logické zjednotenie)
[1] FALSE
Kód
# Double-double: aspoň 10 v dvoch štatistikách
double_double <- (body >= 10) + (asistencie >= 10) + (doskoky >= 10) >= 2
double_double
[1] TRUE
Tip

Pri zložitejších podmienkach používajte okrúhle zátvorky ().

4.4 Zlučovanie logických hodnôt do vektora

Kód
# Skóroval hráč v posledných 4 zápasoch aspoň 25 bodov?
vals <- c(TRUE, FALSE, TRUE, TRUE)
sum(vals)      # počet zápasov s aspoň 25 bodmi (TRUE = 1)
[1] 3
Kód
mean(vals)     # podiel takýchto zápasov
[1] 0.75

5 Numerické vektory

5.1 Generovanie vektorov

Kód
set.seed(2026)   # aby boli náhodné čísla reprodukovateľné

v1 <- c(3, 6, 9, 12)                      # zadanie prvkov ručne
v2 <- 1:8                                 # postupnosť 1, 2, ..., 8
v3 <- seq(from = 0, to = 2, by = 0.5)     # postupnosť s krokom 0.5
v4 <- rep(2, times = 6)                   # 2, 2, 2, 2, 2, 2
v5 <- runif(5)                            # rovnomerné rozdelenie na [0, 1]
v6 <- rnorm(5)                            # normálne rozdelenie N(0, 1)

v1; v2; v3; v4; v5; v6
[1]  3  6  9 12
[1] 1 2 3 4 5 6 7 8
[1] 0.0 0.5 1.0 1.5 2.0
[1] 2 2 2 2 2 2
[1] 0.6986735 0.5565305 0.1401400 0.2857233 0.5553690
[1] -1.9577250  1.0848713  0.2039567  0.5011464  1.0301596

5.2 Príklad z NBA: body v 5 zápasoch

Kód
body_zapasy <- c(31, 28, 35, 22, 40)
names(body_zapasy) <- paste("Zápas", 1:5)
body_zapasy
Zápas 1 Zápas 2 Zápas 3 Zápas 4 Zápas 5 
     31      28      35      22      40 

5.3 Aritmetické operácie s vektormi

Kód
v <- c(2, 4, 6, 8)
v + 10                # každý prvok zväčšíme o 10
[1] 12 14 16 18
Kód
v * 3                 # každý prvok vynásobíme 3
[1]  6 12 18 24
Kód
(v + 1) / 2
[1] 1.5 2.5 3.5 4.5
Kód
exp(v)                # exponenciálna funkcia z každého prvku
[1]    7.389056   54.598150  403.428793 2980.957987
Kód
sum(c(1, 2, 3) * c(2, 2, 2))             # skalárny súčin - výsledok je skalár
[1] 12
Kód
crossprod(c(1, 2, 3), c(2, 2, 2))        # skalárny súčin - výsledok je matica 1x1
     [,1]
[1,]   12
Kód
c(1, 2, 3) * c(2, 2, 2)                  # Hadamardov súčin (po prvkoch)
[1] 2 4 6

5.4 Operácie s dvoma vektormi rovnakého rozmeru

Kód
body    <- c(31, 28, 35, 22, 40)
minuty  <- c(36, 34, 38, 30, 41)

length(body)
[1] 5
Kód
length(minuty)
[1] 5
Kód
body / minuty                 # body na minútu v každom zápase
[1] 0.8611111 0.8235294 0.9210526 0.7333333 0.9756098
Kód
round(body / minuty * 36, 1)  # prepočet na 36 minút
[1] 31.0 29.6 33.2 26.4 35.1
Varovanie

Pri operáciách po prvkoch musia mať oba vektory rovnakú dĺžku. Pri rôznych dĺžkach R vektor kratší “recykluje”, čo býva zdrojom chýb.

5.5 Indexovanie a výber prvkov vektora

Kód
x <- c(25, 14, 33, 8, 41, 19, 30)   # body v 7 zápasoch

x[1]           # prvý prvok
[1] 25
Kód
x[2:4]         # druhý až štvrtý prvok
[1] 14 33  8
Kód
x[-1]          # všetky prvky okrem prvého
[1] 14 33  8 41 19 30
Kód
x[x > 25]      # zápasy s viac ako 25 bodmi
[1] 33 41 30
Kód
which(x > 25)  # poradie týchto zápasov
[1] 3 5 7

5.6 Práca s chýbajúcimi hodnotami

Kód
# Hráč v 2. a 4. zápase nenastúpil (DNP) - chýbajúce hodnoty NA
y <- c(22, NA, 30, NA, 27)
is.na(y)
[1] FALSE  TRUE FALSE  TRUE FALSE
Kód
mean(y)                  # NA
[1] NA
Kód
mean(y, na.rm = TRUE)    # NA ignorujeme
[1] 26.33333

5.7 Základné štatistiky a usporiadanie prvkov

Kód
z <- c(18, 25, 31, 12, 27)
mean(z)                      # priemer
[1] 22.6
Kód
sd(z)                        # smerodajná odchýlka
[1] 7.569676
Kód
max(z)                       # maximum
[1] 31
Kód
summary(z)                   # rýchly prehľad
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   12.0    18.0    25.0    22.6    27.0    31.0 
Kód
sort(z)                      # vzostupne
[1] 12 18 25 27 31
Kód
sort(z, decreasing = TRUE)   # zostupne
[1] 31 27 25 18 12

5.8 Malé cvičenie

Vytvorte vektor w s číslami 1 až 30 a vypočítajte súčet všetkých nepárnych čísel.

Kód
w <- 1:30
sum(w[w %% 2 == 1])
[1] 225

6 Matice

6.1 Vytvorenie matíc

Kód
m       <- matrix(1:12, nrow = 3, ncol = 4)             # hodnoty po stĺpcoch
m_byrow <- matrix(1:12, nrow = 3, byrow = TRUE)         # hodnoty po riadkoch
m; m_byrow
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    5    6    7    8
[3,]    9   10   11   12

6.2 Príklad z NBA: body troch hráčov v štyroch zápasoch

Kód
body_mat <- matrix(c(30, 25, 28, 33,
                     22, 27, 31, 24,
                     18, 20, 15, 26),
                   nrow = 3, byrow = TRUE,
                   dimnames = list(c("Hráč A", "Hráč B", "Hráč C"),
                                   paste("Zápas", 1:4)))
knitr::kable(body_mat, caption = "Body hráčov v jednotlivých zápasoch")
Body hráčov v jednotlivých zápasoch
Zápas 1 Zápas 2 Zápas 3 Zápas 4
Hráč A 30 25 28 33
Hráč B 22 27 31 24
Hráč C 18 20 15 26

6.3 Rozmery matice

Kód
dim(m)       # (riadky, stĺpce)
[1] 3 4
Kód
nrow(m); ncol(m)
[1] 3
[1] 4

6.4 Adresovanie prvkov matice

Kód
body_mat[1, 2]            # Hráč A, 2. zápas
[1] 25
Kód
body_mat[, 3]             # všetci hráči v 3. zápase
Hráč A Hráč B Hráč C 
    28     31     15 
Kód
body_mat["Hráč B", ]      # všetky zápasy hráča B
Zápas 1 Zápas 2 Zápas 3 Zápas 4 
     22      27      31      24 
Kód
body_mat[1:2, 2:3]        # podmatica: riadky 1-2, stĺpce 2-3
       Zápas 2 Zápas 3
Hráč A      25      28
Hráč B      27      31

6.5 Maticové operácie

Kód
A <- matrix(c(2, 0, 1, 3), nrow = 2)
B <- matrix(c(1, 4, 2, 5), nrow = 2)

A + B        # sčítanie matíc
     [,1] [,2]
[1,]    3    3
[2,]    4    8
Kód
A * B        # Hadamardov súčin (po prvkoch)
     [,1] [,2]
[1,]    2    2
[2,]    0   15
Kód
A %*% B      # násobenie matíc
     [,1] [,2]
[1,]    6    9
[2,]   12   15
Kód
t(A)         # transpozícia
     [,1] [,2]
[1,]    2    0
[2,]    1    3
Kód
det(A)       # determinant
[1] 6
Kód
solve(A)     # inverzia (ak existuje)
     [,1]       [,2]
[1,]  0.5 -0.1666667
[2,]  0.0  0.3333333

6.6 Zlučovanie vektorov do matíc

Kód
body_hrac1 <- c(30, 25, 28)
body_hrac2 <- c(22, 27, 31)

cbind(body_hrac1, body_hrac2)   # po stĺpcoch
     body_hrac1 body_hrac2
[1,]         30         22
[2,]         25         27
[3,]         28         31
Kód
rbind(body_hrac1, body_hrac2)   # po riadkoch
           [,1] [,2] [,3]
body_hrac1   30   25   28
body_hrac2   22   27   31

6.7 Štatistiky po riadkoch (stĺpcoch) matice

Kód
apply(body_mat, 1, mean)   # priemer bodov každého hráča (po riadkoch)
Hráč A Hráč B Hráč C 
 29.00  26.00  19.75 
Kód
apply(body_mat, 2, sum)    # súčet bodov v každom zápase (po stĺpcoch)
Zápas 1 Zápas 2 Zápas 3 Zápas 4 
     70      72      74      83 
Kód
rowMeans(body_mat)         # to isté skrátene
Hráč A Hráč B Hráč C 
 29.00  26.00  19.75 
Kód
colSums(body_mat)
Zápas 1 Zápas 2 Zápas 3 Zápas 4 
     70      72      74      83 

6.8 Malé cvičenie

Vytvorte maticu 4x4 s hodnotami 1 až 16 po riadkoch, vypočítajte stĺpcové sumy a súčin matíc \(M^T M\).

Kód
M2 <- matrix(1:16, nrow = 4, byrow = TRUE)
colSums(M2)
[1] 28 32 36 40
Kód
t(M2) %*% M2
     [,1] [,2] [,3] [,4]
[1,]  276  304  332  360
[2,]  304  336  368  400
[3,]  332  368  404  440
[4,]  360  400  440  480

7 Vlastné čísla a vlastné vektory matíc

7.1 Čo znamenajú?

Nech \(\mathbf A\) je štvorcová matica. Vlastné číslo \(\lambda\) a príslušný vlastný vektor \(\mathbf h \ne \mathbf 0\) spĺňajú vzťah

\[ \mathbf A \mathbf h = \lambda \mathbf h. \]

Násobenie maticou \(\mathbf A\) teda pôsobí na vlastný vektor ako násobenie číslom \(\lambda\): smer ostáva zachovaný (pri \(\lambda < 0\) sa obráti) a dĺžka sa násobí hodnotou \(|\lambda|\).

7.2 Príklad 2 × 2: ručný výpočet

Použijeme symetrickú maticu (\(\mathbf A^T = \mathbf A\)), aké sa používajú napríklad ako variančno-kovariančné matice:

\[ \mathbf A = \begin{pmatrix} 3 & 1 \\ 1 & 3 \end{pmatrix}. \]

Z podmienky \((\mathbf A - \lambda \mathbf I)\mathbf h = \mathbf 0\) má sústava netriviálne riešenie práve vtedy, keď \(\det(\mathbf A-\lambda \mathbf I)=0\), teda

\[ \begin{vmatrix} 3-\lambda & 1 \\ 1 & 3-\lambda \end{vmatrix} = \lambda^2-6\lambda+8 = (\lambda-4)(\lambda-2) = 0 \quad\Longrightarrow\quad \lambda_1=4,\ \lambda_2=2. \]

Vlastné vektory dostaneme dosadením do \((\mathbf A-\lambda\mathbf I)\mathbf h=\mathbf 0\) a normalizáciou na dĺžku 1:

  • pre \(\lambda_1=4\) dostávame \(-h_{1}+h_{2}=0\), teda \(h_1=h_2\),
  • pre \(\lambda_2=2\) dostávame \(h_{1}+h_{2}=0\), teda \(h_2=-h_1\).

\[ \mathbf h_1= \begin{pmatrix} \sqrt{1/2}\\ \sqrt{1/2} \end{pmatrix}, \qquad \mathbf h_2= \begin{pmatrix} \sqrt{1/2}\\ -\sqrt{1/2} \end{pmatrix}. \]

Každý nenulový násobok týchto vektorov je tiež vlastným vektorom. Keďže je \(\mathbf A\) symetrická, vlastné vektory sú navzájom kolmé: \(\mathbf h_1^T\mathbf h_2 = \tfrac12 - \tfrac12 = 0\).

7.3 Výpočet pomocou funkcie eigen()

Funkcia eigen() je súčasťou základného R. Argument symmetric = TRUE použijeme, keď vieme, že matica je symetrická.

Kód
A_eig <- matrix(c(3, 1,
                  1, 3),
                nrow = 2, byrow = TRUE)

eig_A <- eigen(A_eig, symmetric = TRUE)   # výsledok je list
eig_A
eigen() decomposition
$values
[1] 4 2

$vectors
          [,1]       [,2]
[1,] 0.7071068 -0.7071068
[2,] 0.7071068  0.7071068
Kód
lambda_A <- eig_A$values     # vlastné čísla
V_A      <- eig_A$vectors    # vlastné vektory v stĺpcoch

# Overenie vzťahu A v = lambda v pre prvý vlastný pár
all.equal(as.vector(A_eig %*% V_A[, 1]), lambda_A[1] * V_A[, 1])
[1] TRUE

Znak $ vyberá pomenovanú zložku listu (eig_A$values, eig_A$vectors). R vracia vlastné čísla zostupne a vlastné vektory s jednotkovou dĺžkou; od našich ručne zvolených sa môžu líšiť znamienkom, pretože \(\mathbf v\) aj \(-\mathbf v\) sú rovnako správne.

7.4 Geometrické znázornenie

Pri vlastnom vektore zostáva jeho obraz \(\mathbf A\mathbf x\) na tej istej priamke ako \(\mathbf x\): vľavo je 4-krát dlhší, vpravo 2-krát.

Kód
local({
  povodne <- par(mfrow = c(1, 2), mar = c(4, 4, 3, 1), bg = "white")
  on.exit(par(povodne))

  priklady <- list(c(1, 1), c(1, -1))
  nazvy <- c("Vlastný vektor: lambda = 4",
             "Vlastný vektor: lambda = 2")

  for (j in seq_along(priklady)) {
    x_plot  <- priklady[[j]]
    Ax_plot <- as.vector(A_eig %*% x_plot)
    plot(NA, xlim = c(-2, 5), ylim = c(-3, 5),
         asp = 1, xlab = "Prvá súradnica", ylab = "Druhá súradnica",
         main = nazvy[j], cex.main = 0.9)
    abline(h = 0, v = 0, col = "grey80")
    arrows(0, 0, Ax_plot[1], Ax_plot[2],
           col = "#e56020", lwd = 4, length = 0.12)
    arrows(0, 0, x_plot[1], x_plot[2],
           col = "#1d428a", lwd = 2, lty = 2, length = 0.10)
    legend("topleft", legend = c("x", "Ax"),
           col = c("#1d428a", "#e56020"),
           lty = c(2, 1), lwd = c(2, 4), bty = "n", cex = 0.8)
  }
})

Vektor x (modrá, prerušovaná) a jeho obraz Ax (oranžová) pre dva vlastné vektory.

7.5 Matica 3 × 3, stopa a determinant

Pre štvorcovú maticu platí: súčet vlastných čísel sa rovná stope matice (súčtu diagonálnych prvkov) a ich súčin sa rovná determinantu.

Kód
B_eig <- matrix(c(3, 1, 0,
                  1, 3, 0,
                  0, 0, 5), nrow = 3, byrow = TRUE)
eig_B <- eigen(B_eig, symmetric = TRUE)
eig_B$values                                    # 5, 4, 2
[1] 5 4 2
Kód
c(sucet_vlastnych_cisel = sum(eig_B$values),    # obe hodnoty sú 11
  stopa_matice          = sum(diag(B_eig)))
sucet_vlastnych_cisel          stopa_matice 
                   11                    11 
Kód
c(sucin_vlastnych_cisel = prod(eig_B$values),   # obe hodnoty sú 40
  determinant           = det(B_eig))
sucin_vlastnych_cisel           determinant 
                   40                    40 

7.6 Malé cvičenie

Pre variančno-kovariančnú maticu štatistík hráča (body, doskoky, asistencie na zápas) vypočítajte vlastné čísla a vlastné vektory.

Štatistika Body Doskoky Asistencie
Body 36.00 6.00 8.00
Doskoky 6.00 9.00 2.50
Asistencie 8.00 2.50 6.25
Kód
# Vytvorenie matice
C <- matrix(c(
  36.00, 6.00, 8.00,    # Body
   6.00, 9.00, 2.50,    # Doskoky
   8.00, 2.50, 6.25     # Asistencie
), nrow = 3, byrow = TRUE,
dimnames = list(c("Body", "Doskoky", "Asistencie"),
                c("Body", "Doskoky", "Asistencie")))

C
           Body Doskoky Asistencie
Body         36     6.0       8.00
Doskoky       6     9.0       2.50
Asistencie    8     2.5       6.25
Kód
# Doplňte: výpočet a výpis vlastných čísel a vlastných vektorov

Nápoveda k funkcii eigen(): R: eigen().