Základné operácie v R

Autor

Iris Vitárius

Publikované

8. októbra 2026

Globálne nastavenie Chunkov

V nižšie uvedenom Chunku je urobené základné globálne nastavenie Chunkov v celom Notebooku.

  • echo nastavuje, či chceme v Notebooku vypisovať jednotlivé kódy R
  • message je nastavený na FALSE, čo znamená, že sa budú potláčať pracovné výstupy z R, t.j. napríklad výsledok otvárania knižníc, a niektoré iné výstupy, ktoré ale pre celkový Notebook nemajú takmer žiaden význam a sú vhodné skôr pri ladení kódov.
  • warning nastavený na FALSE potláča zobrazenie chybových hlášok
knitr::opts_chunk$set(
  echo = TRUE,
  message = FALSE,
  warning = FALSE
)

Úvod k základným operáciám v R

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

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

Tam, kde je to užitočné, sú zahrnuté malé cvičenia.

Skaláre (jednočíselné hodnoty)

Numerické skaláre

# Priradenie konštanty do premennej
a <- 7
b <- 3.5

# Arithmetic
sum_ab      <- a + b        # sucet
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 %% 3       # zbytok po delení tromi (tzv modulo)
int_div_ab  <- a %/% b      # celočíselné delenie


# Rounding
round_b   <- round(b)       # zaokruhlovanie smerom k najblizsiemu celemu cislu
ceil_b    <- ceiling(b)     # najblizsie vyssie cele cislo
floor_b   <- floor(b)       # najblizsie nizsie cele cislo

a; b
[1] 7
[1] 3.5
sum_ab; diff_ab; prod_ab; quot_ab; power_ab; mod_ab; int_div_ab
[1] 10.5
[1] 3.5
[1] 24.5
[1] 2
[1] 907.4927
[1] 1
[1] 2
round_b; ceil_b; floor_b
[1] 4
[1] 4
[1] 3

Poznámky

  • ^ operátor umocňovania.
  • %% je modulo, teda zbytok po delení,
  • round(x, digits = 0) zaokrúhľovanie na určitý počet desatinných miest (digits=). ak digits = 0, potom ide o celočíselné zaokrúhľovanie

Malé cvičenie

Vypočítajte:

\[\sqrt{49} + 2^4\]

sqrt(49) + 2^4
[1] 23

Vypočítajte:

\[\frac{(13-3+4)\times8}{2}\]

(13-3+4) * 8 / 2
[1] 56

Vypočítajte:

\[\frac{\lfloor 8.7 \rfloor + (10 \pmod 3)}{\lceil 2.1 \rceil} - \text{round}(1.5)\]

(floor(8.7) + (10 %% 3)) / ceiling(2.1) - round(1.5)
[1] 1

Text

Vytváranie textovými premennými a práca s nimi

first <- "Vladimir"                       # definovanie obsahu textovej premennej first
last  <- "Gazda"                          # definovanie obsahu text. premennej last
full  <- paste(first, last)               # spojenie dvoch text. premennych do jednej (s medzerou)
full_nospace <- paste0(first, last)       # spojenie bez medzery
csv_line <- paste("apple", "banana", "pear", sep = ",")  # spojenie textov s oddelovacom ,
first; last; full; full_nospace; csv_line   # bodkočiarka tu nahradzuje odskok na novy riadok 
[1] "Vladimir"
[1] "Gazda"
[1] "Vladimir Gazda"
[1] "VladimirGazda"
[1] "apple,banana,pear"

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

x <- "R is great!"
nchar(x)                 # počet znakov  v retazci "R is great!"
[1] 11
substr(x, 1, 5)          # podreťazec od 1. do 5. znaku
[1] "R is "

Tip: Knižnica stringr mnohé zaujímavé možnosti práce s textami, ale implicitné knižnice R pokrývajú väčšinu bežných potrieb páce s textami.

Logické (boolovské) hodnoty a premenné

Základy

p <- TRUE
q <- FALSE
!p                 # NOT
[1] FALSE
p & q              # AND
[1] FALSE
p | q              # OR
[1] TRUE
xor(p, q)          # exclusive OR - platí len jedno z p,alebo q
[1] TRUE

Logický výsledok porovnávania

3 < 5
[1] TRUE
7 >= 7
[1] TRUE
"cat" == "cat"
[1] TRUE
"cat" != "dog"   # vykricnik je tu v zmysle negacie. Napr.:   !=, !>, !<, !TRUE
[1] TRUE
!TRUE
[1] FALSE

Zložitejšie logické operácie

x <- 10
x > 5 & x < 20      # a sucasne - logicky prienik (sucin)
[1] TRUE
x < 0 | x > 100     # alebo - logicke zjednotenie (sucet)
[1] FALSE
                    # pri zlozitejsich vztahoch pouzivajte zatvorky ()

Zlučovanie viacerých log. premenných do vektora

vals <- c(TRUE, FALSE, TRUE, TRUE)   # definicia vektora s logickymi hodnotami

Malé cvičenie

Zistite, či je číslo \(x = 8\) mimo intervalu \((10, 50)\) alebo či platí negácia podmienky \((x < 5)\):

x <- 8
(x < 10 | x > 50) | !(x < 5)
[1] TRUE

Numerické vektory

Generovanie vektorov

v1 <- c(2, 4, 6, 8)
v2 <- 1:5                  # postupnost 1,2,3,4,5
v3 <- seq(from = 0, to = 1, by = 0.25)  # postupnost s krokom 0.25
v4 <- rep(3, times = 5)    # 3,3,3,3,3  # 5 clenna postupnost trojak
v5 <- runif(5)   # generovanie rovnomerne rozdelenych premennych v intervale [0,1]
v6 <- rnorm(5)   # generovanie normalne rozdelenych premennych
v7 <- 10+2*runif(2)
v8 <- rnorm(20,10,3)
v1; v2; v3; v4; v5
[1] 2 4 6 8
[1] 1 2 3 4 5
[1] 0.00 0.25 0.50 0.75 1.00
[1] 3 3 3 3 3
[1] 0.73181986 0.03540396 0.06629452 0.44099185 0.94084083

Aritmetické operácie s vektormi

v <- c(1, 2, 3, 4)
v + 10           # kazdy prvok vektora zvacsime o 10
[1] 11 12 13 14
v * 2            # kazdy prvok vektora prenasobime 2
[1] 2 4 6 8
(v + 1) / 2
[1] 1.0 1.5 2.0 2.5
exp(v)           # exponencialna funkcia z kazdeho prvku vektora
[1]  2.718282  7.389056 20.085537 54.598150
sum(c(1,2,3),c(1,1,1))          # skalarny sucin - vysledok je skalar
[1] 9
crossprod(c(1,2,3),c(1,1,1))    # skalarny sucin - vysledok je matica 1x1
     [,1]
[1,]    6
c(1,2,3)*c(1,1,1)               # Hadamardov sucin (sucin zodpovedajucich prvkov vektora)
[1] 1 2 3

Matematické operácie s 2 vektormi rovnakého rozmeru

length(c(1,2,3,4,5))
[1] 5
length(v5)            #vektor v5 je definovany vyssie
[1] 5
c(1,2,3,4,5) + v5     # pozor, oba vektory musia mat rovnaky rozmer
[1] 1.731820 2.035404 3.066295 4.440992 5.940841

Indexovanie a výber niektorych prvkov vektora

x <- c(5, 12, 3, 18, 7, 0, 21)
x[1]           # indexovanie - novy jedno-prvkovy vektor - prvy prvok vektora x
[1] 5
x[2:4]         # novy vektor s druhym az stvrtym prvkom vektora x
[1] 12  3 18
x[-1]          # novy vektor - vsetky prvky vektora x okrem prvého
[1] 12  3 18  7  0 21
x[x > 10]      # novy vektor definovany prvkami x vacsimi ako 10
[1] 12 18 21
which(x > 10)  # ktore prvky zodpovedaju podmienke vacsieho ako 10?
[1] 2 4 7

Práca s chýbajúcimi hodnotami

y <- c(1, NA, 3, NA, 5)
is.na(y)
[1] FALSE  TRUE FALSE  TRUE FALSE
mean(y)                 # NA
[1] NA
mean(y, na.rm = TRUE)   # remove NAs
[1] 3

Základné štatistiky a usporiadanie prvkov vektora podľa veľkosti

z <- c(10, 3, 5, 8, 2)
mean(z)                 # priemerna hodnota
[1] 5.6
sd(z)                  # standardna odchylka
[1] 3.361547
max(z)                  # maximalna hodnota
[1] 10
summary(z)              # rychly prehlad zakladnych statistik o vektore
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    2.0     3.0     5.0     5.6     8.0    10.0 
sort(z)                 # rastuce usporiadanie 
[1]  2  3  5  8 10
sort(z, decreasing = TRUE)  # klesajuce
[1] 10  8  5  3  2

Malé cvičenie

Vytvorte vektor a vypočítajte jeho súčet.

v <- c(5, 6, 11, 14)
sum(v)
[1] 36

Vytvorte vektor \(\mathbf{x} = (3,6,9,12,15,18)\). 1. Vypočítajte súčet všetkých hodnôt. 2. Zistite, ktoré hodnoty sú väčšie ako priemer vektora.

x <- c(2,6,10,18,20,21)

sum(x)
[1] 77
x[x > mean(x)]
[1] 18 20 21

Vypočítajte štandardnú odchýlku vektora.

v <- c(1,4,7,10,4)

sd(v)
[1] 3.420526

Vytvorte postupnosť čísel od \(2\) do \(10\) s krokom \(2\). Vynásobte ju vektorom samých dvojok, vyfiltrujte prvky väčšie ako \(10\) a určite ich priemer.

v <- seq(from = 2, to = 10, by = 2)
v_nasobok <- v * rep(2, times = 5)
vybrane <- v_nasobok[v_nasobok > 10]
priemer <- mean(vybrane)
vybrane
[1] 12 16 20
priemer
[1] 16

Matice

Vytvorenie matíc

m <- matrix(1:12, nrow = 3, ncol = 4)            # hodnoty sú zadavane po stlpcoch
m_byrow <- matrix(1:12, nrow = 3, byrow = TRUE)  # hodnoty su zadavane 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

Rozmery matice

dim(m)                   # (rows, cols)
[1] 3 4
m
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12

Adresovanie prvkov matice

m[1, 2]      # riadok 1, stlpec 2
[1] 4
m[ , 3]      # vsetky prvky v tretom stlpci - vysledok matica 3x1
[1] 7 8 9
m[2, ]       # vsetky prvky v druhom riadku - vysledok matica 1*3
[1]  2  5  8 11
m[1:2, 2:3]  # podmatica tvorena riadkami 1, 2 a stlpcami 2, 3
     [,1] [,2]
[1,]    4    7
[2,]    5    8

Maticové operácie

A <- matrix(c(1,2,3,4), nrow = 2)
B <- matrix(c(5,6,7,8), nrow = 2)

A + B        # scitanie matic
     [,1] [,2]
[1,]    6   10
[2,]    8   12
A * B        # Hadamard product - nasobenie po zodpovedajucich prvkoch
     [,1] [,2]
[1,]    5   21
[2,]   12   32
A %*% B      # nasobenie matic
     [,1] [,2]
[1,]   23   31
[2,]   34   46
t(A)         # transpozicia matice A - vymena riadkov a stlpcov
     [,1] [,2]
[1,]    1    2
[2,]    3    4
det(A)       # determinant matice
[1] -2
solve(A)     # inverzia matice (ak je matica regularna - teda inverzia sa da spocitat)
     [,1] [,2]
[1,]   -2  1.5
[2,]    1 -0.5

Zlučovanie vektorov do matíc

C <- cbind(1:3, 4:6)   #  - po stlpcoch 
D <- rbind(1:3, 4:6)   #  - po riadkoch 
C; D
     [,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    6
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6

Vypočítanie zvolenej štatistiky po riadkoch (stĺpcoch) matice

M <- matrix(1:9, nrow = 3)
M
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9
apply(M, 1, sum)   # suma po riadkoch
[1] 12 15 18
apply(M, 2, mean)  # priemery po stĺpcoch
[1] 2 5 8

Malé cvičenie

Vytvorte maticu \(\mathbf{A}\) a vypočítajte súčet všetkých jej prvkov.

A <- matrix(c(4,8,10,12), nrow = 2)
sum(A)
[1] 34

Vytvorte maticu \(\mathbf{B}\) s hodnotami 3 až 12 a vypočítajte jej transpozíciu.

B <- matrix(3:12, nrow=3)
t(B)
     [,1] [,2] [,3]
[1,]    3    4    5
[2,]    6    7    8
[3,]    9   10   11
[4,]   12    3    4

Vytvorte maticu \(\mathbf{C}\) s hodnotami 3 až 12 usporiadanými do 3 riadkov. 1. Vypočítajte súčty jednotlivých riadkov. 2. Vypočítajte súčty jednotlivých stĺpcov.

C <- matrix(3:12, nrow=3)

rowSums(C)
[1] 30 24 28
colSums(C)
[1] 12 21 30 19

Vytvorte maticu \(A\) s číslami od \(1\) do \(6\) (s rozmerom \(2 \times 3\), plnenú po riadkoch). Pomocou jej transpozície \(t(A)\) vypočítajte maticový súčin \(M = A \cdot t(A)\). Z matice \(M\) vyberte prvý riadok a vypočítajte priemery jednotlivých stĺpcov matice \(M\).

A <- matrix(1:6, nrow = 2, byrow = TRUE)
M <- A %*% t(A)
prvy_riadok <- M[1, ]
priemery_stlpcov <- apply(M, 2, mean)
M
     [,1] [,2]
[1,]   14   32
[2,]   32   77
prvy_riadok
[1] 14 32
priemery_stlpcov
[1] 23.0 54.5

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

Čo znamenajú vlastné čísla a vlastné vektory?

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

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

Násobenie maticou \(\mathbf A\) teda pôsobí na vlastný vektor rovnako ako násobenie číslom \(\lambda\). Výsledok reprezentuje vektor rovnakého smeru, ale rozličných veľkostí:

  • ak \(\lambda > 0\), orientácia vektora sa zachová;
  • ak \(\lambda < 0\), orientácia sa obráti;
  • ak \(\lambda = 0\), výsledkom je nulový vektor.

Dĺžka sa násobí hodnotou \(|\lambda|\). Napríklad pri \(\lambda = 3\) sa vektor predĺži trojnásobne, pri \(\lambda = 0.5\) sa skráti na polovicu. Tento geometrický opis sa týka reálnych vlastných čísel a vektorov.

Jednoduchý príklad: matica 2 × 2

Použijeme symetrickú maticu, teda maticu, pre ktorú platí \(A^T = A\):1

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

Vlastné čísla nájdeme podľa nasledovného postupu:

\[\begin{eqnarray} \mathbf A \mathbf h & = & \lambda \mathbf h \\ \mathbf A \mathbf h - \lambda \mathbf h & = & \mathbf 0 \\ (\mathbf A - \lambda \mathbf I)\mathbf h & = & \mathbf 0, \end{eqnarray} \]

kde \(\mathbf I\) je jednotková matica.

Netriviálne (nenulové) riešenie tejto sústavy existuje vtedy, keď

\[ \det(\mathbf A-\lambda \mathbf I)=0. \]

V našom prípade

\[ \mathbf A-\lambda \mathbf I = \begin{pmatrix} 2-\lambda & 1 \\ 1 & 2-\lambda \end{pmatrix}, \]

a preto

\[ \det(\mathbf A-\lambda \mathbf I) = \begin{vmatrix} 2-\lambda & 1 \\ 1 & 2-\lambda \end{vmatrix} = (2-\lambda)^2-1. \]

Dostávame charakteristickú rovnicu

\[ (2-\lambda)^2-1 = \lambda^2-4\lambda+3 = (\lambda-3)(\lambda-1) = 0. \]

Vlastné čísla sú koreňmi (riešeniami) kvadratickej rovnice a teda

\[ \lambda_1=3, \qquad \lambda_2=1. \]

Výpočet vlastného vektora pre \(\lambda_1=3\)

Vlastný vektor vypočítame zo vzťahu

\[ (\mathbf A-\lambda_1\mathbf I)\mathbf h_1=\mathbf 0. \]

Po dosadení \(\lambda_1=3\) dostávame

\[ \left[ \begin{pmatrix} 2 & 1\\ 1 & 2 \end{pmatrix} - 3 \begin{pmatrix} 1&0\\ 0&1 \end{pmatrix} \right] \begin{pmatrix} h_{11}\\ h_{21} \end{pmatrix} = \begin{pmatrix} 0\\ 0 \end{pmatrix}. \]

Teda

\[ \begin{pmatrix} -1&1\\ 1&-1 \end{pmatrix} \begin{pmatrix} h_{11}\\ h_{21} \end{pmatrix} = \begin{pmatrix} 0\\ 0 \end{pmatrix}. \]

Získame sústavu rovníc

\[ \begin{eqnarray} -h_{11}+h_{21} &=&0,\\ h_{11}-h_{21} &=&0, \end{eqnarray} \] pričom zavedieme ešte dodatočnú podmienku normalizácie vlastných vektorov2, teda

\[\sqrt{h_{11}^2 + h_{21}^2} = 1\]

Prvé dve rovnice vyjadrujú tú istú podmienku:

\[ h_{11}=h_{21}. \]

Teda z normalizačnej podmienky dostávame

\[\sqrt{h_{11}^2 + h_{21}^2} = 1 \Longleftrightarrow h_{11} = h_{21} = \pm \sqrt{\frac{1}{2}}\]

Môžeme preto napríklad zvoliť

\[ h_{11}=+\sqrt{\frac{1}{2}}, \]

a potom

\[ h_{21}=+\sqrt{\frac{1}{2}}. \]

Vlastný vektor zodpovedajúci vlastnému číslu \(\lambda_1=3\) môže byť teda

\[ \mathbf h_1= \begin{pmatrix} +\sqrt{\frac{1}{2}}\\ +\sqrt{\frac{1}{2}} \end{pmatrix}. \]

Každý nenulový násobok tohto vektora je však tiež vlastným vektorom. Napríklad

\[ \begin{pmatrix} +1\\ +1 \end{pmatrix} \]

predstavuje ten istý smer.

Výpočet vlastného vektora pre \(\lambda_2 = 1\)

Keďže platí

\[ \begin{aligned} \left[ \begin{pmatrix} 2 & 1 \\ 1 & 2 \end{pmatrix} - 1 \cdot \begin{pmatrix} 1 & 0 \\ 0 & 1 \end{pmatrix} \right] \begin{pmatrix} h_{12} \\ h_{22} \end{pmatrix} &= \begin{pmatrix} 0 \\ 0 \end{pmatrix} \\[1em] \Longleftrightarrow \qquad \begin{pmatrix} 1 & 1 \\ 1 & 1 \end{pmatrix} \begin{pmatrix} h_{12} \\ h_{22} \end{pmatrix} &= \begin{pmatrix} 0 \\ 0 \end{pmatrix}. \end{aligned} \]

dostávame sústavu rovníc

\[ \begin{eqnarray} h_{12}+h_{22} &=&0,\\ h_{12}+h_{22} &=&0. \end{eqnarray} \]

Z toho vyplýva

\[ h_{22}=-h_{12}. \]

Ak zvolíme dodatočnú normalizačnú podmienku

\[\sqrt{h_{12}^2 + h_{22}^2} = 1,\] potom ak

\[ h_{12}=\sqrt{\frac{1}{2}}, \]

pre druhý prvok vektora bude platiť

\[ h_{22}=-\sqrt{\frac{1}{2}}. \]

Vlastný vektor zodpovedajúci vlastnému číslu \(\lambda_2=1\) teda môžeme zapísať ako

\[ \mathbf h_2= \begin{pmatrix} \sqrt{\frac{1}{2}}\\ -\sqrt{\frac{1}{2}} \end{pmatrix}. \]

Opäť platí, že ľubovoľný nenulový násobok tohto vektora je tiež vlastným vektorom.

Overenie pre prvý vlastný vektor

Pre prvý vlastný vektor platí

\[ \mathbf A\mathbf h_1 = \begin{pmatrix} 2&1\\ 1&2 \end{pmatrix} \begin{pmatrix} \sqrt{\frac{1}{2}}\\ \sqrt{\frac{1}{2}} \end{pmatrix} = 3 \begin{pmatrix} \sqrt{\frac{1}{2}}\\ \sqrt{\frac{1}{2}} \end{pmatrix} = \lambda_1 \mathbf h_1 \]

Teda

\[ \mathbf A\mathbf h_1=\lambda_1\mathbf h_1. \]

Podobne sa to dá ukázať aj pre druhé vlastné číslo \(\lambda_2\) a druhý vlastný vektor \(\mathbf h_2\).

Matice vlastných čísel a vlastných vektorov

Dostávame teda dvojice vlastných čísel a vlastných vektorov:

\[ \lambda_1=3, \qquad \mathbf h_1= \begin{pmatrix} \sqrt{\frac{1}{2}}\\ \sqrt{\frac{1}{2}} \end{pmatrix}, \]

a

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

Keďže matica \(\mathbf A\) je symetrická, vlastné vektory zodpovedajúce rôznym vlastným číslam sú navzájom ortogonálne (navzájom kolmé a po dvojiciach ich skalárne súčiny sa rovnajú nule). Skutočne,

\[ \mathbf h_1^T\mathbf h_2 = \left( \sqrt{\frac{1}{2}},\sqrt{\frac{1}{2}} \right) \begin{pmatrix} \sqrt{\frac{1}{2}}\\ -\sqrt{\frac{1}{2}} \end{pmatrix} = \frac{1}{2} - \frac{1}{2} = 0. \]

Výpočet pomocou R funkcie eigen()

Funkcia eigen() je súčasťou základného R; nepotrebujeme ďalšiu knižnicu. Argument symmetric = TRUE použijeme, keď vieme, že matica je symetrická. Pri všeobecnej matici môžeme napísať jednoducho eigen() a R symetriu skontroluje samo.

# Vytvorenie matice z analytického príkladu
A_eig <- matrix(c(2, 1,
                  1, 2),
                nrow = 2, byrow = TRUE)

A_eig
     [,1] [,2]
[1,]    2    1
[2,]    1    2
# Výpočet vlastných čísel a vlastných vektorov
eig_A <- eigen(A_eig, symmetric = TRUE) #vyuzitie funkcie eigen()
eig_A                                   # vysledok sa ulozil do listu, ktory sme nazvali eig_A
eigen() decomposition
$values
[1] 3 1

$vectors
          [,1]       [,2]
[1,] 0.7071068 -0.7071068
[2,] 0.7071068  0.7071068
 #Dalej pristupime k rozbaleniu obsahu listu eig_A

lambda_A <- eig_A$values    # vektor vlastných čísel - ulozenie do lambda_A
V_A <- eig_A$vectors        # vlastné vektory v stĺpcoch ulozenie do V_A

lambda_A
[1] 3 1
V_A
          [,1]       [,2]
[1,] 0.7071068 -0.7071068
[2,] 0.7071068  0.7071068

Výsledok eig_A je list. Znak $ vyberá jeho pomenovanú zložku:

Zápis v R Význam
eig_A$values Všetky vlastné čísla
eig_A$vectors Vlastné vektory uložené v stĺpcoch
eig_A$values[1] Prvé vlastné číslo
eig_A$vectors[, 1] Vlastný vektor prislúchajúci prvému vlastnému číslu

Pri reálnej symetrickej matici R vráti vlastné čísla zostupne; tu teda 3 a 1. Vlastné vektory majú jednotkovú dĺžku. Môžu sa preto líšiť od našich ručne zvolených vektorov mierkou alebo znamienkom. Vektory \(v\) aj \(-v\) sú rovnako správne: vlastný vektor nie je jednoznačný.

Ak potrebujeme iba vlastné čísla:

eigen(A_eig, symmetric = TRUE, only.values = TRUE)$values
[1] 3 1

Overenie vzťahu Av = λv

V R použijeme na násobenie matice a vektora operátor %*%. Operátor * používame pri násobení vektora skalárom.

lambda_1 <- lambda_A[1]
v_1 <- V_A[, 1]

lava_strana <- as.vector(A_eig %*% v_1)
prava_strana <- lambda_1 * v_1

cat("Ľavá strana je ", paste(lava_strana, collapse = ", "), 
    " a pravá strana je ", paste(prava_strana, collapse = ", "), "!", sep = "")
Ľavá strana je 2.12132034355964, 2.12132034355964 a pravá strana je 2.12132034355964, 2.12132034355964!

Geometrické znázornenie

Porovnáme dva vlastné vektory. Pri vlastnom vektore zostáva jeho obraz (transformácia) na tej istej priamke.

local({
  povodne <- par(mfrow = c(1, 2), mar = c(4, 4, 3, 1))
  on.exit(par(povodne))

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

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

Vektor x (modrý) a jeho obraz Ax (oranžový).

V prostrednom obrázku sa šípky prekrývajú, pretože \(Ax = x\). Cyklus for opakuje rovnaký postup oba vektory. Funkcia local() udržiava pomocné premenné grafu oddelene od ostatných výpočtov.

Matica 3 × 3 - príklad v R

B_eig <- matrix(c(2, 1, 0,
                  1, 2, 0,
                  0, 0, 4), nrow = 3, byrow = TRUE)
eig_B <- eigen(B_eig, symmetric = TRUE)
eig_B$values                # 4, 3, 1
[1] 4 3 1
eig_B$vectors
     [,1]      [,2]       [,3]
[1,]    0 0.7071068  0.7071068
[2,]    0 0.7071068 -0.7071068
[3,]    1 0.0000000  0.0000000
# Súčty štvorcov prvkov jednotlivých stĺpcov sú 1.
colSums(eig_B$vectors^2)
[1] 1 1 1
# Overenie všetkých troch vlastných párov.
max(abs(B_eig %*% eig_B$vectors -
        eig_B$vectors %*% diag(eig_B$values)))
[1] 5.551115e-16

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. Vlastné čísla pritom počítame aj s ich násobnosťami.

c(sucet_vlastnych_cisel = sum(eig_B$values),
  stopa_matice = sum(diag(B_eig)))             # obe hodnoty sú 8
sucet_vlastnych_cisel          stopa_matice 
                    8                     8 
c(sucin_vlastnych_cisel = prod(eig_B$values),
  determinant = det(B_eig))                   # obe hodnoty sú 12
sucin_vlastnych_cisel           determinant 
                   12                    12 

Malé cvičenie

Pre variančno kovariančnú maticu počítanú z daily close cien akcií za posledný rok, vypočítajte vlastné čísla a vlastné vektory.

Asset T JNK TQQQ
T 0.000134 0.000008 0.000118
JNK 0.000008 0.000016 0.000062
TQQQ 0.000118 0.000062 0.001185
# vytvorenie matice
C <- matrix(c(
  0.000134, 0.000008, 0.000118,  # Column 1 (T)
  0.000008, 0.000016, 0.000062,  # Column 2 (JNK)
  0.000118, 0.000062, 0.001185   # Column 3 (TQQQ)
), nrow = 3, byrow = TRUE)

Vypočítajte vlastné čísla a vlastné vektory a vypíšte ich

C <- matrix(c(
  0.000134, 0.000008, 0.000118,  # Column 1 (T)
  0.000008, 0.000016, 0.000062,  # Column 2 (JNK)
  0.000118, 0.000062, 0.001185   # Column 3 (TQQQ)
), nrow = 3, byrow = TRUE)
vysledok <- eigen(C)
print("Vlastné čísla:")
[1] "Vlastné čísla:"
print(vysledok$values)
[1] 1.201381e-03 1.209261e-04 1.269271e-05
print("Vlastné vektory:")
[1] "Vlastné vektory:"
print(vysledok$vectors)
            [,1]        [,2]        [,3]
[1,] -0.11011897  0.99378875  0.01605395
[2,] -0.05265593  0.01029636 -0.99855963
[3,] -0.99252263 -0.11080569  0.05119505

Help k funkcii eigen: R: eigen().

Poznámky pod čiarou

  1. Aj v budúcnosti budeme pracovať len s takýmito maticami – maticami, ktoré predstavujú variančno-kovariančné vzťahy medzi premennými – tzv. variančno-kovariančnými maticami (variance-covariance matrix).↩︎

  2. normalizované vektory majú veľkosť 1↩︎