Bölüm 7 Matrisler

Matrisler, iki boyutta düzenlenmiş verilerdir, yanyana ya da altalta dizilenmis vektör gibi düşünülebilirler. İkişer elemanlı 3 vektörümüz oldugunu düşünelim:

a <- 1:2
b <- 3:4
c <- 5:6

Şimdi bunları yanyana birleştirip, iki satır üç sütunlu bir matris oluşturalım. Bunun için cbind() yani, column-bind (sütun bağlama) fonksiyonunu kullanacağız.

cbind(a, b, c)
##      a b c
## [1,] 1 3 5
## [2,] 2 4 6

Aynı şekilde rbind() yani row-bind (satır bağlama) fonksiyonu ile bu vektörleri satır satır birleştirip, 3 satır iki sutunlu bir matris de elde edebiliriz:

rbind(a, b, c)
##   [,1] [,2]
## a    1    2
## b    3    4
## c    5    6

Her satır ve sütunu ayrı ayrı vektör şeklinde birleştirerek matris oluşturmak yerine matrix() fonksiyonunu da kullanabiliriz.

matrix(1:9, ncol = 3)
##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8
## [3,]    3    6    9

Burada 1den 9a kadar sayıları 3 sütuna (ncol = 3 ile belirttik) yerleştirdik. Aynı şekilde satır sayısını da girebilirdik (nrow). matrix() fonksiyonu ile kullanabileceğimiz bir diğer argüman ise byrow argümanı. Önceki örnekte 1den 9a kadar sayıları içeren bir vektör oluşturup 3 sütuna bölmüştük. Bu fonksiyon varsayılan argümanlarla çalıştırıldığında önce birinci sütunu doldurup sonra ikinciye geçiyor. Eğer bunun yerine önce satırları doldurmasını istersek:

matrix(1:9, ncol = 3, byrow = T)
##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]    4    5    6
## [3,]    7    8    9

Şimdi 1:3 birinci satırı, 4:6 ikinci satırı oluşturdu.

7.1 Matris boyutları

Bunlar dışında matrislerin vektörlerden bir farkı da boyut özelliğinin olması. Oysa vektörlerde uzunluk özelliğimiz vardır. Şu örneklere bakalım:

mymat <- cbind(a, b, c)
length(a)
## [1] 2
length(mymat)
## [1] 6

‘mymat’ objesinin boyuna bakmak istediğimizde toplam eleman sayısı olan 6yı veriyor. Oysa bu kaç satır ve sütundan oluştuğu bilgisini vermediğinden, matrisin yapısını anlamamızı zorlaştırıyor. Bu bilgiyi öğrenmek için dim() fonksiyonunu kullanacağız.

dim(mymat)
## [1] 2 3

Burada önemli olan bir bilgi, dim() fonksiyonu ilk olarak satır sayısını sonra sütun sayısını yazar. Son olarak dim() fonksiyonunun vektörler üzerinde işe yaramayacağını görelim:

dim(a)
## NULL

7.2 Matris indisleri

Matris içindeki verilere ulaşmak için yine köşeli parantez kullanılabilir. Ancak bu sefer birden fazla boyut olduğundan satır ve sütunu virgül ile ayırarak yazacağız. Örneğin:

mymat
##      a b c
## [1,] 1 3 5
## [2,] 2 4 6
mymat[1, 2:3]
## b c 
## 3 5

mymat[1, 2:3] kodu ile, mymat matrisinin 1. satırının 2den 3e kadar olan elemanlarını istemiş oluyoruz.

7.3 Aritmetik işlemler

Aynı vektörlerde olduğu gibi aritmetik işlemler yapmak da mümkün.

mymat * 3
##      a  b  c
## [1,] 3  9 15
## [2,] 6 12 18
mymat + 2
##      a b c
## [1,] 3 5 7
## [2,] 4 6 8

Peki ya uzunluğu birden büyük bir vektör ile işlem yapmak istersek?

mymat
##      a b c
## [1,] 1 3 5
## [2,] 2 4 6
mymat * c(1, 2)
##      a b  c
## [1,] 1 3  5
## [2,] 4 8 12

Bunu anlamak için matrisin ilk üç elemanına bakalım:

mymat[1:3]
## [1] 1 2 3

Virgül ile satır ve sütun ayırmadığımızdan elde ettiğimiz obje de matrisin ilk 3 elemanından oluşan bir vektör oldu. Buradan gördüğümüz gibi matrisin birinci elemanı ilk satır ilk sütunda, ikinci elemanı ilk sütün ikinci satırda - ve sonra diğer sütunlara geçiyoruz. Bu matrisi bir vektör ile işlem yapmak istediğimizde de aynı vektörlerde olduğu gibi önce birinci eleman vektördeki birinci elemanla, ikinci eleman vektördeki ikinci elemanla işleme giriyor. Vektördeki elemanlar bittiğinden tekrar başa dönüyoruz ve matrisin üçüncü elemanı vektörün ilk elemanı ile işleme giriyor ve böyle devam ediyor. Bu işlemin satır ve sütun sayısıyla alakalı olmadığını göstermek adına bir başka örnek:

mymat * 1:3
##      a b  c
## [1,] 1 9 10
## [2,] 4 4 18

Matris transpozu, satır ve sütunların yer değiştirmesi işlemidir ve t() fonksiyonu ile gerçekleştirilir.

t(mymat)
##   [,1] [,2]
## a    1    2
## b    3    4
## c    5    6

Önceki örnekler matris çarpımı değil, matris içindeki değerlerin başka bir skalar ya da vektörle çarpımına örnekti. Rda matris çarpımı, ya da matris nokta çarpımı, yapmak da mümkün ve bu %*% operatörü ile yapılabilir. İki matrisin nokta çarpımı işlemine girebilmesi için birinci matrisin sütün sayısının, ikinci matrisin satır sayısına eşit olması gerekir.

mymat2 = matrix(c(1,2,3), nrow = 3, ncol = 1)
mymat2
##      [,1]
## [1,]    1
## [2,]    2
## [3,]    3
mymat %*% mymat2
##      [,1]
## [1,]   22
## [2,]   28

Bir matrisin tersi, kendisi ile çarpıldığında birim matrisi verir ve Rda solve() fonksiyonu ile hesaplanabilir. Bu işlem ancak kare matrisler üzerinde gerçekleştirilebilir.

mymat = matrix(sample(1:9), 3, 3)
mymat
##      [,1] [,2] [,3]
## [1,]    9    5    7
## [2,]    2    6    4
## [3,]    1    8    3
solve(mymat)
##             [,1]       [,2]       [,3]
## [1,]  0.21212121 -0.6212121  0.3333333
## [2,]  0.03030303 -0.3030303  0.3333333
## [3,] -0.15151515  1.0151515 -0.6666667
mymat %*% solve(mymat)
##              [,1] [,2] [,3]
## [1,] 1.000000e+00    0    0
## [2,] 1.110223e-16    1    0
## [3,] 1.110223e-16    0    1

Bunlar dışında sık kullanılan matris işlemleri için crossprod(), det(), eigen(), svd() gibi fonksiyonlar da temel Rda mevcuttur.

Son olarak, matrislerle çalışırken kolaylaştırıcı rowMeans(), colMeans(), rowSums(), colSums() gibi satır / sütun ortalamalarına ve toplamlarına erişmek için fonksiyonlar mevcut.

mymat
##      [,1] [,2] [,3]
## [1,]    9    5    7
## [2,]    2    6    4
## [3,]    1    8    3
rowSums(mymat)
## [1] 21 12 12
colSums(mymat)
## [1] 12 19 14
rowMeans(mymat)
## [1] 7 4 4
colMeans(mymat)
## [1] 4.000000 6.333333 4.666667