11 Rad s matricama

11.1 Provjera tipa matrice

Je li objekt matrica može se provjeriti koristeći is.matrix().

is.matrix(o)
## [1] TRUE

Osim toga, moguće je provjeriti radi li se o matrici i koristeći class():

class(o)
## [1] "matrix" "array"

Za uvid u karakteristike elemenata matrice, koristi se typeof().

typeof(o)
## [1] "double"

11.2 Odabir elemenata matrice

Kao i kod vektora, iz matrica je moguće odabirati elemente s obzirom na njihovu poziciju.

A[2,3]
## [1] 17

Pritom prvi broj označava redak, a drugi stupac. Tako je 17 element koji pripada drugom retku i trećem stupcu matrice A. Ispis matrice moguće je odabrati i s obzirom na retke i stupce. Na primjer, ako se želi odabrati/ ispisati samo prvi redak matrice A, tada je to moguće učiniti na sljedeći način:

A[1,]
## [1] 10 13 16
o[1,]
## Stupac 1. Stupac 2. Stupac 3. Stupac 4. Stupac 5. 
##         1         4        10        25         3

Možete uočiti razliku između ispisa prvog retka matrice A kojoj nisu zadani nazivi stupaca i redaka, u odnosu na matricu o, kojoj su zadani nazivi stupaca i redaka.Ipak, uočite i to da imenovanje stupaca i redaka ne utječe na odabir.

Ako bi se, koristeći isti izraz upisao, npr. o[2,], tada bi rezultat prikazao samo drugi redak. Ako se želi ispisati više redaka, tada je to potrebno definirati npr. ovako:

o[c(1,2),]
##       Stupac 1. Stupac 2. Stupac 3. Stupac 4. Stupac 5.
## Prvi          1         4        10        25         3
## Drugi         2         5        15         1         4

Slično vrijedi i za stupce, samo će se u tom slučaju prva pozicija prije zareza ostavljati praznom.

o[,1]
##  Prvi Drugi Treći 
##     1     2     3
o[,c(1,2)]
##       Stupac 1. Stupac 2.
## Prvi          1         4
## Drugi         2         5
## Treći         3         5
o[,c(3,5)]
##       Stupac 3. Stupac 5.
## Prvi         10         3
## Drugi        15         4
## Treći        20         5

11.3 Zamjena elemenata matrica

Kao i kod vektora, elementi matrice mogu se zamijeniti drugim elementom. Na primjer:

o[2,2] <-100
o
##       Stupac 1. Stupac 2. Stupac 3. Stupac 4. Stupac 5.
## Prvi          1         4        10        25         3
## Drugi         2       100        15         1         4
## Treći         3         5        20         2         5

Ako je potrebno, mogu se zamijeniti i svi elementi pojedinog retka ili stupca.

o[,3] <- c(15,20,25)
o
##       Stupac 1. Stupac 2. Stupac 3. Stupac 4. Stupac 5.
## Prvi          1         4        15        25         3
## Drugi         2       100        20         1         4
## Treći         3         5        25         2         5
o[3,] <- c(4,6,26,3,6)
o
##       Stupac 1. Stupac 2. Stupac 3. Stupac 4. Stupac 5.
## Prvi          1         4        15        25         3
## Drugi         2       100        20         1         4
## Treći         4         6        26         3         6

Ako je potrebno, pri zamjeni se mogu koristiti i već prikazane operacije na vektorima.

o[3,]<-c(o[3,]+1)
o
##       Stupac 1. Stupac 2. Stupac 3. Stupac 4. Stupac 5.
## Prvi          1         4        15        25         3
## Drugi         2       100        20         1         4
## Treći         5         7        27         4         7
o[,5] <- c(o[,5]*3)
o
##       Stupac 1. Stupac 2. Stupac 3. Stupac 4. Stupac 5.
## Prvi          1         4        15        25         9
## Drugi         2       100        20         1        12
## Treći         5         7        27         4        21

Generalno, sve operacije u kojima se matrice pojavljuju bit će osjetljive na elemente koji nedostaju (NA), zbog čega je brisanje elemenata matrice (iako moguće) nepoželjno.

11.4 Filtriranje matrice - odabir elemenata prema kriteriju

Slično kao kod vektora, mogu se ispisati elementi prema zadanom kriteriju, npr. elementi veći od 10.

o[o>10]
## [1] 100  15  20  27  25  12  21

11.5 Kreiranje matrice s ponovljenim vrijednostima i zadavanje dijagonale

Osim toga, moguće su situacije u kojima će se htjeti kreirati specifične matrice. Na primjer matrica koja sadržava sve 0, osim jedinica na dijagonali. To je moguće učiniti na sljedeći način:

D <- matrix(0, nrow = 3, ncol = 3)
diag(D) <-1
D
##      [,1] [,2] [,3]
## [1,]    1    0    0
## [2,]    0    1    0
## [3,]    0    0    1

Slično tome, moguće je učiniti i obrnuto. Na primjer, ako se želi kreirati matrica koja će sadržavati sve jedinice, osim nula na dijagonali, to je moguće na sljedeći način:

E <-matrix(1, nrow = 3, ncol = 3)
diag(E)<-0
E
##      [,1] [,2] [,3]
## [1,]    0    1    1
## [2,]    1    0    1
## [3,]    1    1    0

11.6 Spajanje matrica

Kao što je moguće spajati vektore, tako je moguće spajati i matrice. Pritom je potrebno paziti na dimenzije matrica koje se spajaju. Matrice koje se podudaraju u broju redaka mogu se spojiti funkcijom cbind(), a matrice koje se podudaraju po broju stupaca funkcijom rbind(). Ranije kreirane matrice A i B imaju jednak broj stupaca i redaka. Provjerimo koja je razlika ako se primjenjuje spajanje po stupcu i spajanje po retku.

AB<-rbind(A,B)
AB
##      [,1] [,2] [,3]
## [1,]   10   13   16
## [2,]   11   14   17
## [3,]   12   15   18
## [4,]    1    2    3
## [5,]    4    5    6
## [6,]    7    8    9

Prethodnom naredbom matrice su spojene po recima (r-row). Kreirana je nova matrica, AB, pri čemu matrica A tvori prva tri retka nove matrice, a matrica B sljedeća tri retka.

Sljedećom naredbom matrice se spajaju po stupcima (c-column). Tako će druga matrica biti nadodana prvoj matrici u obliku dodatna tri stupca.

BA<-cbind(A,B)
BA
##      [,1] [,2] [,3] [,4] [,5] [,6]
## [1,]   10   13   16    1    2    3
## [2,]   11   14   17    4    5    6
## [3,]   12   15   18    7    8    9

U sljedećem primjeru kombinirat ćemo ranije naučene funkcije. Recimo da se odabirom svakog sedmog elementa iz vektora f želi kreirati vektor p. Nakon provjere duljine vektora, dodjeljuju mu se odgovarajuće dimenzije. Usporedbom s već kreiranim matricama, uočava se da novokreirana matrica ima jednak broj redaka kao matrica o, te se matrice p i o spajaju funkcijom cbind().

p<-f[seq(1,101,by=7)]
p
##  [1] 100 107 114 121 128 135 142 149 156 163 170 177 184 191 198
length(p)
## [1] 15
dim(p)<-c(3,5)
po<-cbind(o,p)
po
##       Stupac 1. Stupac 2. Stupac 3. Stupac 4. Stupac 5.                    
## Prvi          1         4        15        25         9 100 121 142 163 184
## Drugi         2       100        20         1        12 107 128 149 170 191
## Treći         5         7        27         4        21 114 135 156 177 198

11.7 Operacije na matricama

Nadalje, jedna od često potrebnih operacija s matricama je transponiranje, t() (zamjena redaka i stupaca).

t(po)
##           Prvi Drugi Treći
## Stupac 1.    1     2     5
## Stupac 2.    4   100     7
## Stupac 3.   15    20    27
## Stupac 4.   25     1     4
## Stupac 5.    9    12    21
##            100   107   114
##            121   128   135
##            142   149   156
##            163   170   177
##            184   191   198

Matrice se mogu i zbrajati

A+B
##      [,1] [,2] [,3]
## [1,]   11   15   19
## [2,]   15   19   23
## [3,]   19   23   27

Nadalje, matrice se mogu množiti skalarom:

3*A
##      [,1] [,2] [,3]
## [1,]   30   39   48
## [2,]   33   42   51
## [3,]   36   45   54

Osim toga, matrice se mogu i množiti:

A*B
##      [,1] [,2] [,3]
## [1,]   10   26   48
## [2,]   44   70  102
## [3,]   84  120  162

Obratite pozornost na to da je ova operacija rezultirala množenjem odgovarajućih elemenata dviju matrica, ali ne i množenjem matrica kako se to učilo na matematici. Da biste to napravili, potrebno je koristiti operator %*%:

A%*%B
##      [,1] [,2] [,3]
## [1,]  174  213  252
## [2,]  186  228  270
## [3,]  198  243  288

11.8 Konverzija matrice u vektor

Matrice je moguće konvertirati u vektor, ali pritom treba posvetiti osobitu pozornost poretku elemenata. Na primjer, izravna transformacija u vektor rezultirat će očitavanjem elemenata po stupcu. Podsjetimo se prvo kako je definirana matrica A.

A
##      [,1] [,2] [,3]
## [1,]   10   13   16
## [2,]   11   14   17
## [3,]   12   15   18

Ako ovu matricu izravno trasformiramo u vektor, dobivamo sljedeći rezultat:

v <- as.vector(A)
v
## [1] 10 11 12 13 14 15 16 17 18

Uočava se da se u vektoru nalaze elementi matrice iščitani po stupcima. S obzirom da se u praksi matrični zapis često koristi za jednostavniju i bržu manipulaciju podataka tablica, češće ćete htjeti da elementi u vektoru budu iščitani i zapisani po recima u matrici. To se može postići međukorakom, odnosno transponiranjem matrice.

v <- as.vector(t(A))
v
## [1] 10 13 16 11 14 17 12 15 18

Nadalje, tijekom konverzije matrice u vektor, moguće je promijeniti vrijednosti matrice na način da se one umanje, uvećaju ili množe skalarom. Na primjer, ako se svi elementi matrice žele uvećati za npr. 5, tada će se to učiniti na sljedeći način:

v <- as.vector(5+t(A))
v
## [1] 15 18 21 16 19 22 17 20 23

Također, ako se elementi žele uvećati 5 puta, tada je elemente matrice potrebno pomožiti brojem 5:

v <- as.vector(5*t(A))
v
## [1] 50 65 80 55 70 85 60 75 90

Također, pri transformaciji u vektor, moguće je i promijeniti predznak vrijednostima elemenata matrice:

v <- as.vector(-t(A))
v
## [1] -10 -13 -16 -11 -14 -17 -12 -15 -18

Ako se vrijednosti u matrici žele uvećati, umanjiti ili množiti s različitim vrijednostima po stupcima, onda je moguće za to primijeniti vektor:

v <-as.vector(c(1,2,3)*t(A))
v
## [1] 10 26 48 11 28 51 12 30 54

Napomena: pri svakoj provedenoj konverziji podataka, poželjno je ispisati rezultate kako biste provjerili je li konverzija rezultirala željenim promjenama. Ovi su postupci često samo pomoćne radnje u zahtjevnijim analizama i greške u ovim koracima mogu rezultirati ozbiljnim pogrešama u konačnim rezultatima.

11.9 Konverzija matrice u podatkovni okvir

Matrice podataka s uključenim nazivima stupaca i redaka često su korisnije u obliku podatkovnog okvira, zato jer brojni paketi koriste upravo takvu strukturu podataka. Matrice se lako mogu spremiti u obliku podatkovnog okvira na sljedeći način:

X<-as.data.frame(po)
str(X)
## 'data.frame':    3 obs. of  10 variables:
##  $ Stupac 1.: num  1 2 5
##  $ Stupac 2.: num  4 100 7
##  $ Stupac 3.: num  15 20 27
##  $ Stupac 4.: num  25 1 4
##  $ Stupac 5.: num  9 12 21
##  $ V6       : num  100 107 114
##  $ V7       : num  121 128 135
##  $ V8       : num  142 149 156
##  $ V9       : num  163 170 177
##  $ V10      : num  184 191 198

Obratite pozornost na prozor Environment, u kojem se sad pojavio objekt X.

11.10 Izračun pokazatelja deskriptivne statistike za matrice

Osim toga, ako se izdvoji pojedini stupac matrice, na njemu se mogu izvršavati naredbe kao i na vektorima. Na primjer, ako se želi utvrditi prosjek vrijednosti prvog stupca matrice A, to se može učiniti na sljedeći način:

mean(A[,1])
## [1] 11

Treba obratiti posebnu pozornost na to što se događa ako se ne izdvoji specifični stupac, nego se odabere mean za matricu A:

mean(A)
## [1] 14

Naime, izračunata je aritmetička sredina svih elemenata matrice A, što može predstavljati problem ako postoji pojmovna razlika u vrijednostima zapisanim u stupcima matrice (tj., ako bi stupci matrice trebali predstavljati varijable).

11.11 Prednosti i nedostaci rada s matricama te najčešće greške

Nekonzistentnost dimenzija matrica

Jedna od čestih grešaka prilikom rada s matricama je pokušaj izvođenja operacija na matricama koje nemaju kompatibilne dimenzije (na primjer, pokušaj množenja dviju matrica čije dimenzije ne zadovoljavaju pravilo množenja matrica). R će vratiti grešku ako dimenzije nisu usklađene za određenu operaciju.

Neispravna primjena funkcija

Ovdje se misli na pokušaj primjene funkcija koje očekuju vektore (na primjer, sum(), mean()) izravno na matricama bez specificiranja dimenzija (redaka ili stupaca) na kojima se funkcija treba primijeniti. To može dovesti do neočekivanih rezultata, kao što je izračun prosjeka svih elemenata u matrici umjesto po stupcima ili recima.

Zaboravljanje postavke byrow prilikom kreiranja matrice:

Važno je zadati na koji će se način matrica popunjavati: po stupcima ili recima. Ako zaboravite postaviti byrow=TRUE, a namjeravali se popuniti matricu po redovima, elementi će se rasporediti po stupcima, što može rezultirati neželjenim rasporedom podataka. Štoviše, ako ne izvršite provjeru nakon kreiranja matrice, preskakanje ovog argumenta može uzrokovati veće pogreške u kasnijim izračunima.

Korištenje nespojivih tipova podataka

Budući da matrice u R-u mogu sadržavati samo jedan tip podataka, pokušaj kombiniranja brojeva i tekstualnih vrijednosti u istoj matrici rezultirat će konverzijom svih elemenata u tekstualne vrijednosti. To može izazvati probleme pri kasnijoj obradi podataka.

Pogrešno indeksiranje i odabir podataka

Pogreške u indeksiranju, poput pokušaja pristupa elementima koji ne postoje (zbog krive specifikacije indeksa) mogu dovesti do grešaka ili neočekivanih rezultata. Također, bitno je razumjeti razliku između odabira pojedinačnih elemenata, redaka ili stupaca.

Zanemarivanje atributa matrice prilikom transformacija

Prilikom konverzije matrice u vektor ili izvođenja nekih transformacija, moguće je izgubiti imena redaka i stupaca ili druge atribute matrice. Važno je biti svjestan ovih promjena i po potrebi ponovno postaviti atribute.

Matrice u R-u su moćan alat za numeričku analizu i manipulaciju podataka, ali imaju određena ograničenja koja ih čine manje fleksibilnima u odnosu na liste ili podatkovne okvire za određene vrste analiza i obrade podataka. Evo ključnih ograničenja matrica:

Homogenost tipova podataka

Jedno od glavnih ograničenja matrica jest da one mogu sadržavati samo jedan tip podataka. Ako matrica sadrži brojeve i tekstualne podatke, svi će biti prisilno pretvoreni u tekstualni tip, što može dovesti do gubitka numeričkih operacija nad tim podacima. Nasuprot tome, podatkovni okviri i liste mogu sadržavati elemente različitih tipova podataka (npr., numeričke, logičke, znakovne), što ih čini prikladnijima za složene skupove podataka koji se često nalaze u praktičnim primjenama.

Dvodimenzionalna struktura

Matrice su inherentno dvodimenzionalne, što znači da imaju ograničenje na retke i stupce. Ovo ograničenje može biti problematično kada radite s višedimenzionalnim podacima. Liste, s druge strane, mogu sadržavati složene i višedimenzionalne strukture podataka, uključujući i druge liste ili podatkovne okvire, omogućavajući time veću fleksibilnost u organizaciji podataka.

Manipulacija podacima i pristup

Podatkovni okviri u R-u su optimizirani za statističku analizu i manipulaciju podataka, s brojnim funkcijama iz različitih paketa koje olakšavaju rad s podacima. Podatkovni okviri omogućuju jednostavno filtriranje, sortiranje, grupiranje i sumiranje podataka, dok matrice nisu toliko prilagođene za takve operacije.

Pristup i indeksiranje

Iako matrice omogućuju pristup elementima, recima i stupcima putem indeksiranja, podatkovni okviri pružaju dodatnu fleksibilnost omogućujući pristup stupcima po imenu, što može biti intuitivnije i smanjiti mogućnost grešaka prilikom analize podataka.

Veličina i performanse

Za vrlo velike skupove podataka, posebno kada se radi o rijetkim matricama koje sadrže mnogo nula, specijalizirane strukture podataka poput rijetkih matrica (sparseMatrix iz paketa Matrix) mogu pružiti značajne prednosti u smislu učinkovitosti pohrane i performansa obrade. Podatkovni okviri i liste ne nude izravnu podršku za ovakve optimizacije.

Unatoč svojim ograničenjima, matrice se i dalje često koriste u mnogim scenarijima u R-u, posebice zbog njihove efikasnosti i jednostavnosti kada su u pitanju specifični tipovi analize i manipulacije podacima. Evo nekoliko situacija u kojima su matrice posebno korisne.

Linearna algebra i matematičke operacije

Matrice su idealne za izvođenje operacija linearne algebre, uključujući množenje matrica, transponiranje, izračunavanje determinanti, inverza, i svojstvenih vrijednosti i vektora. U situacijama gdje su ove operacije ključne, kao što je rješavanje sustava linearnih jednadžbi, matrice su nezaobilazan alat.

Numerička analiza

Matrice se često koriste u numeričkim simulacijama i algoritmima, gdje je potrebno manipulirati velikim količinama numeričkih podataka. Primjeri uključuju numeričko rješavanje diferencijalnih jednadžbi, optimizaciju i simulacije.

Obrada signala i slike

U obradi signala i slika, podaci su često predstavljeni kao dvodimenzionalni nizovi (na primjer, pikseli slike), gdje matrice omogućuju efikasnu obradu i analizu tih podataka, uključujući filtriranje, detekciju rubova, i segmentaciju.

Statistički modeli i multivarijatna analiza

Pri modeliranju statističkih odnosa među višedimenzionalnim podacima, matrice se koriste za predstavljanje podataka i koeficijenata u višedimenzionalnim statističkim modelima, kao što su višestruka linearna regresija, analiza varijance i faktorska analiza.

Grafovi i mreže

U analizi grafova i mreža, matrice susjedstva i incidencije koriste se za predstavljanje veza među čvorovima, što omogućava primjenu algoritama za pretraživanje grafova, pronalaženje najkraćih putova, i druge analize mrežnih struktura.

Računanje s rijetkim matricama

U situacijama gdje su podaci rijetko distribuirani (npr., u matricama s mnogo nula), specijalizirane strukture rijetkih matrica omogućuju efikasno pohranjivanje i obradu, čineći matrice prikladnima za rad s velikim skupovima podataka u kojima je većina elemenata nula.