8 – Matlab’da Vektör ve Matris İşlemleri, Linspace Fonksiyonu

  1. yazıda, Matlab’a gücünü veren en önemli öğelerden olan vektör ve matrisleri inceleyeceğiz. Başlamadan önce, önceki yazılarda da belirttiğimiz gibi vektörleri tek boyutlu matrisler olarak ele alabiliriz. Bu da ayrı bir konu olarak düşünmemizi gerektirmeyeceği için bizi bir konudan kurtarmış olur.

Lafı uzatmadan, vektörlerin tanımlanması ve üzerlerindeki temel işlemler ile başlayalım. Öncelikle, x isimli bir vektöre, 1’den 10 a kadar olan sayıları nasıl vereceğimizi görelim:

>> x = 1:10

x =

     1     2     3     4     5     6     7     8     9    10

Gördüğümüz üzere atama yapıldı. Aradaki : işareti bize sağında ve solunda yer alan iki sayının arasındaki tam sayıları bu sayılar dahil olmak üzere vermeyi sağlıyor.  Yaptığımız atamanın öğelerine ulaşırken daha önceki yazılarımızda tanımlanmış değişkenlerin listesini who veya whos ile bir başka değişkene atarken kullanmıştık. Burada da benzer bir kullanım mevcut. Bu atamayı yeri gelmişken daha iyi anlamak için başka bir tanımlama yapalım ve birkaç örnek verelim. Bu defa, sayılarımız 25 ile 35 arasında olsun. Şimdi kodlarımızı inceleyelim:

>> sayilar = 25:35;
>> sayilar(1)

ans =

    25

>> sayilar(2)

ans =

    26

>> sayilar(9)

ans =

    33

Hazır başlamışken, elimizdeki vektörün birden fazla öğesini de aynı yöntemle alabiliriz. Yani mantığını açıklamak gerekirse, 1:10 yazdığımızda 1 ile 10 arasındaki sayıları alıyorduk. Şimdi yapacağımız örnekte ise, yine bu sayıları alacağız ancak bu defa indis belirtmede kullanacağız. Dilerseniz devam etmeden önce kodumuzu bir görelim:

>> sayilar(3:8)

ans =

    27    28    29    30    31    32

Bu değer bize sayilar isimli vektörün 3., 4., 5., 6., 7. ve 8. öğelerini, yani : işareti ile sınırlanmış öğelerini vermeye yaradı. Buradaki 3:8 ifadesinin en başta 1:10 tanımını yaparken kullandığımız ifadeyle aynı olduğuna, fakat kullanım yerinin farklı olması sebebiyle böyle bir sonuç aldığımıza dikkat edin.

Ardışık sayıları artık rahatça alabiliyoruz. Peki, 3’er 3’er ya da 5’er 5’er artan ardışık sayıları almak istersek ne yapacağız? Bunun da tabii ki kolay bir yolu var. Bu defa, tek : işareti yerine 2 tane kullanıyoruz ve yapımız şöyle bir hal alıyor: başlangıç:artış:bitiş. Yani, 2 ile 100 arasına 5’er 5’er artan ardışık sayıları koymak istersek 2:5:10 yazmamız gerekecek. Bunu da hemen onaylayalım:

>> 2:5:100

ans =

  Columns 1 through 11

     2     7    12    17    22    27    32    37    42    47    52

  Columns 12 through 20

    57    62    67    72    77    82    87    92    97

Burada dikkat etmemiz gereken, başlangıç değeriyle başladığımız, ve hesaplanacak son değer bitiş değerine denk gelmiyorsa, kendisinden bir önceki değerin son değer olarak verildiğine dikkat etmemiz. Yani biraz daha açıklayacak olursak, başlangıç değerimiz 2 sabit kalırken, 92-97-102 sırasıyla giden ardışık sayılardan bitiş değerinden hemen önceki olan 97’yi kullandık. Eğer burada bu ardışık sayılar arasında 100 olsaydı, daha önceki 1:10 örneğinde olduğu gibi sonucumuzun son öğesi 100 olacaktı. Bunu farklı örnekler yaparak pekiştirebilirsiniz.

Şimdi bu tanımlamayı biraz daha geliştirelim. Mesela, 5 ile 10 arasına 100 adet sayı girmek istediğimizi varsayalım. Bunu yapmak için bu aralığı eşit bölümlendirmemiz vs. gerekecekken, Matlab bize kolayca yapabilmemiz için linspace isimli bir fonksiyon sağlıyor. Bu fonksiyonun kullanımı ise şu şekilde:

linspace(başlangıç,bitiş,sayı miktarı)

Hemen bir örneğini de görelim:

>> linspace(5,10,100)

ans =

  Columns 1 through 6

    5.0000    5.0505    5.1010    5.1515    5.2020    5.2525

  Columns 7 through 12

    5.3030    5.3535    5.4040    5.4545    5.5051    5.5556

  Columns 13 through 18

    5.6061    5.6566    5.7071    5.7576    5.8081    5.8586

  Columns 19 through 24

    5.9091    5.9596    6.0101    6.0606    6.1111    6.1616

  Columns 25 through 30

    6.2121    6.2626    6.3131    6.3636    6.4141    6.4646

  Columns 31 through 36

    6.5152    6.5657    6.6162    6.6667    6.7172    6.7677

  Columns 37 through 42

    6.8182    6.8687    6.9192    6.9697    7.0202    7.0707

  Columns 43 through 48

    7.1212    7.1717    7.2222    7.2727    7.3232    7.3737

  Columns 49 through 54

    7.4242    7.4747    7.5253    7.5758    7.6263    7.6768

  Columns 55 through 60

    7.7273    7.7778    7.8283    7.8788    7.9293    7.9798

  Columns 61 through 66

    8.0303    8.0808    8.1313    8.1818    8.2323    8.2828

  Columns 67 through 72

    8.3333    8.3838    8.4343    8.4848    8.5354    8.5859

  Columns 73 through 78

    8.6364    8.6869    8.7374    8.7879    8.8384    8.8889

  Columns 79 through 84

    8.9394    8.9899    9.0404    9.0909    9.1414    9.1919

  Columns 85 through 90

    9.2424    9.2929    9.3434    9.3939    9.4444    9.4949

  Columns 91 through 96

    9.5455    9.5960    9.6465    9.6970    9.7475    9.7980

  Columns 97 through 100

    9.8485    9.8990    9.9495   10.0000

Çıktımız biraz uzun olsa da, sanırım fonksiyonun ne yaptığını bize iyi bir şekilde anlatıyor. Şimdi de bu sonucu bir değişkene atayıp, indislerle ilgili biraz pekiştirme yapalım.

>> degisken = linspace(5,10,100);
>> degisken(1)

ans =

     5

>> degisken(1)/3

ans =

    1.6667

>> degisken(4:5)

ans =

    5.1515    5.2020

Devam etmeden önce bilmemiz gereken birkaç küçük özellik var. Vektörlerin tamamını veya bir kısmını, matematik işlemlerine tabii tutabiliriz. Yapacağımız işlem vektörlerin tüm öğelerine etki eder. İsterseniz, 1 ile 2 arasına 5 tane sayı koyup daha sonra bu sayılar üzerinde farklı birkaç işlem yapıp ne demek istediğimi daha açık şekilde görelim.

>> vektor = linspace(1,2,5);
>> vektor

vektor =

    1.0000    1.2500    1.5000    1.7500    2.0000

>> vektor/2

ans =

    0.5000    0.6250    0.7500    0.8750    1.0000

>> vektor/1000

ans =

    0.0010    0.0013    0.0015    0.0018    0.0020

>> sin(vektor)

ans =

    0.8415    0.9490    0.9975    0.9840    0.9093

>> exp(vektor)

ans =

    2.7183    3.4903    4.4817    5.7546    7.3891

>> vektor*10

ans =

   10.0000   12.5000   15.0000   17.5000   20.0000

>> vektor % bir degisiklige ugramadigini gorelim

vektor =

    1.0000    1.2500    1.5000    1.7500    2.0000

Şimdi ne yaptığımıza bir bakalım, öncelikle yukarıda bahsettiğim tanımlamayı yapıp vektor isimli bir değişkene atadık. Yani 1 ile 2 arasına 5 sayı koyup vektor değişkenine atadık. Böylece bu değişkenin öğeleri sırayla 1,1.25,1.5,1.75 ve 2 oldu. Daha sonra bu vektörü farklı sayılarla çarpıp böldük. Sinüsünü aldık, exp(e üssü) fonksiyonuna tabii tuttuk. Burada dikkat etmeniz gereken, yaptığımız işlemin vektörün tüm öğelerine etki ettiğidir. Bu aynı şekilde matrislerde de geçerlidir. En sonra da, yaptığımız bu işlemlerden vektörün etkilenmediğini ve ilk halinde kaldığını göstermek için vektörü tekrar ekrana bastırdık. Burada, daha önce de bahsettiğimiz gibi, vektörün sadece istediğimiz öğelerini de işleme sokabilirdik. Bunu vektor(başlangıç:bitiş)/5 gibi bir formatta yapabilirdik. Vektörün veya vektörün bazı öğelerinin üzerinde yaptığımız işlemlerin kaydedilmesi için farklı bir değişkene sonucu atayabilir, veya yine vektör değişkenine atayabiliriz. Yani:

>> vektor

vektor =

    1.0000    1.2500    1.5000    1.7500    2.0000

>> diger_vektor = vektor/2

diger_vektor =

    0.5000    0.6250    0.7500    0.8750    1.0000

>> vektor % hala ayni kalacak

vektor =

    1.0000    1.2500    1.5000    1.7500    2.0000

>> vektor = vektor/2 % yarisini alip yine vektor isimli degiskene atadik.

vektor =

    0.5000    0.6250    0.7500    0.8750    1.0000

Vektörleri otomatik olarak tanımlayabiliyoruz. Peki, elle tanımlamak istersek? Bunu yaparken köşeli parantezlerden faydalanıyoruz. Öğelerin arasına da boşluk bırakıyoruz. Yani içeriği 43 543 123 6734 olan 4 öğeli bir vektör oluşturmak istersek:

>> vektor = [43 543 123 6734]

vektor =

          43         543         123        6734

yapısını kullanıyoruz.  Şimdi 2 vektörü birbiriyle çarpmamız gerektiğinde ne yapacağımıza bakalım.

Vektörlerin tek boyutlu matrisler olduğunu söylemiştik. Dolayısıyla, vektörlerin çarpımında da matrislerin çarpımında geçerli olan kuralları uyguluyoruz. Yani, vektörlerin boyutları uygun olmalı. 1xm ile mx1 türünde 2 vektörü çarpabilirken 1xm ile 1xm türündeki iki vektörü çarpamayız. Bu konuda hatalar alırsanız matris çarpımları hakkında bilgi edinmenizi öneririm. Şimdi, boyutları uymayan 2 vektör oluşturup çarpmaya çalışalım:

>> vektor1 = 1:5

vektor1 =

     1     2     3     4     5

>> vektor2 = 6:10

vektor2 =

     6     7     8     9    10

>> vektor1*vektor2
Error using  * 
Inner matrix dimensions must agree.

Gördüğümüz üzere matris boyutları uyuşmadığı için hata verdi. Çünkü elimizdeki vektörlerin ikisi de 1×5 boyutunda. Ancak bu vektörler arasında nokta çarpım (skaler çarpım, dot product) yapma şansımız var. Nokta çarpımı normal çarpma işleminden ufak bir işaret farkıyla: .* operatörünü kullanarak yapıyoruz. Yukarıdaki 2 vektörü nokta çarpımla çarpacak olursak:

>> vektor1.*vektor2

ans =

     6    14    24    36    50

sonucunu alırız. Yani karşılıklı olarak aynı indisli öğeler çarpılmış olur. Bu işlemin bölme halini de ./ kullanarak yapabilirsiniz. Ayrıca, her elemanın belirli bir kuvvetini almak isterseniz .^ ifadesini kullanabilirsiniz. Bunu aynı boyutlu matrislerde de kullanacağız. Şimdi matris çarpımını vektörler üzerinde nasıl uygulayacağımıza geçmeden önce, satır ve sütun vektörleri kısaca hatırlayalım.

Satır vektörler, bu yazıda şu ana kadar tanımladığımız gibi, tek satırdan oluşan vektörlerdir. Dolayısıyla m öğe içerdiklerini varsayarsak boyutları 1xm şeklinde olacaktır. Sütun vektörler ise tek sütun, birden fazla satırdan oluşan vektörlerdir. Boyutları da satır vektörlerin tersine, mx1 şeklinde olacaktır(m öğe içerdikleri varsayılsın). Şimdi, sütun vektör tanımlamak istersek, birden fazla satırı nasıl ifade edeceğimize gelelim. Matlab’da satırları ; ile ayırıyoruz. Yani tanımlama esnasında şöyle bir şey yaparsak sütun vektör oluşturmuş oluruz:

sutun_vektor = [1;2;3;4;5]

Şimdi matris çarpmasını tekrar deneyelim:

>> vektor1*sutun_vektor

ans =

    55

Burada, vektor1’in boyutları 1×5, sütun vektörünün boyutları da 5×1 olduğu için sonuç 1×1 oldu, yani bir sayı elde ettik. Biliyoruz ki matris çarpımlarında sıralama önemlidir. Yani 5×1 ile 1×5 i çarparsak 5×5 boyutunda bir matris elde ederiz. Hemen görelim:

>> sutun_vektor*vektor1

ans =

     1     2     3     4     5
     2     4     6     8    10
     3     6     9    12    15
     4     8    12    16    20
     5    10    15    20    25

Vektörlerle ilgili söyleyeceklerimiz şimdilik bu kadar. Şimdi matrislere doğru bir geçiş yapalım. En son elde ettiğimiz çarpımın sonucu da gördüğümüz üzere bir 5×5 boyutunda matristi. Zaten konunun başından beri, matrislerin tek boyutlu vektörler olduklarını söylemiştik.

Matrisleri tanımlarken çok boyutlu vektör tanımladığımızı düşünebiliriz. Yani birden fazla satır ve sütun içerirler. Şimdi 3×3 boyutunda örnek bir matris tanımlayıp görelim:

>> matris = [1 2 3; 4 5 6; 7 8 9]

matris =

     1     2     3
     4     5     6
     7     8     9

Biraz tuş takımını andıran bu sonuç, matris tanımlama ile ilgili kafamızda bir şeylerin oluşmasını sağlamış olmalı. Şimdi de örnek olarak bir denklem sisteminin katsayılar matrisini ve genişletilmiş matrisini oluşturalım:

x + 3y -5z = 12

3x + 7z = 8

5y + 8z = 32

Matrislerimiz şu şekilde oluşacak:

>> katsayilar = [1 3 -5; 3 0 7; 0 5 8]

katsayilar =

     1     3    -5
     3     0     7
     0     5     8

>> genisletilmis = [1 3 -5 12; 3 0 7 8; 0 5 8 32]

genisletilmis =

     1     3    -5    12
     3     0     7     8
     0     5     8    32

Elimizdeki matris bir kare matrisse, bu matrisin kuvvetlerini alabiliriz. Elimizdeki katsayılar matrisi bir kare matris olduğu için, kuvvetini almayı deneyelim. Buradaki kuvvet almanın, vektörlerde her elemanın kuvvetini aldığımız .^ işlevinden tamamen farklı olduğunu belirtmekte fayda var. Ancak yine de, o işlevi kullanarak orada olduğu gibi her elemanın kuvvetini alabiliriz. İkisini de hesaplayalım ve aynı olmadığını görelim:

>> katsayilar^2

ans =

    10   -22   -24
     3    44    41
    15    40    99

>> katsayilar.^2

ans =

     1     9    25
     9     0    49
     0    25    64

Bunu da hallettiğimize göre matris işlemlerine devam edebiliriz. Şimdi, matrisin istediğimiz öğesini veya öğelerini nasıl alacağımızı görelim. Bu işlemin mantığı da aslında vektörlerdekiyle aynı. İlk sıraya satır numarasını, ikinci sıraya sütun numarasını yazıyoruz. Yani matris(satır,sütun) şeklinde bir kullanım var. Ayrıca, Belirli satırları ve/veya sütunları almak istersek araya : koyarak istediğimizi yapabiliriz. Şimdi bununla ilgili farklı örnekler yapalım.

>> katsayilar % matrisimizi hatirlayalim

katsayilar =

     1     3    -5
     3     0     7
     0     5     8

>> katsayilar(2,2) % tam ortadaki eleman, yani 0 gelmeli..

ans =

     0

>> katsayilar(3,2) % satir 3, sutun 2

ans =

     5

>> katsayilar(3,1:2) % satir 3 , sutun 1-2

ans =

     0     5

>> katsayilar(2:3,1:2) % satir 2-3, sutun 1-2

ans =

     3     0
     0     5

Bu konuda daha büyük matrislerle farklı örnekler yapıp konuya ısınabilirsiniz. Şimdi bazı temel matris tanımlamalarını görelim. Birim matris, sıfır matrisi gibi matrisleri tanımlarken uzun uzun matrisleri yazmamıza gerek kalmaz. Matlab bunları kolayca tanımlamamızı sağlayan fonksiyonları içerisinde bulundurur. Şimdi dilerseniz, bu fonksiyonları inceleyelim.

a) Sıfır matrisi oluşturma

Sıfır matrisi oluşturmak için zeros isimli bir fonksiyon kullanıyoruz. Bu fonksiyon 2 argüman alıyor: zeros(satır,sütun). Yani istediğimiz satır ve sütun sayısında sıfır matrisi oluşturabiliyoruz.

>> sifir_matrisi = zeros(6,5)

sifir_matrisi =

     0     0     0     0     0
     0     0     0     0     0
     0     0     0     0     0
     0     0     0     0     0
     0     0     0     0     0
     0     0     0     0     0

 b) Tüm elemanları 1 olan matris oluşturma

Satır ve sütunlarındaki tüm elemanları 1 olan bir matris oluşturabilmek için ones isimli fonksiyonu kullanırız. Bu fonksiyonun argümanları zeros fonksiyonu ile aynıdır: ones(satır,sütun).

>> birler_matrisi = ones(6,5)

birler_matrisi =

     1     1     1     1     1
     1     1     1     1     1
     1     1     1     1     1
     1     1     1     1     1
     1     1     1     1     1
     1     1     1     1     1

 c) Birim ve diagonal matris oluşturma

Esas köşegen üzerinde olan elemanları 1, diğerleri 0 olan matris kare matris ise birim, kare matris değil ise diagonal matris olarak isimlendiriliyordu. Bu kısa hatırlatmanın ardından bu matrislerin nasıl tanımlandığına bakalım. Fonksiyonumuz eye(satır,sütun)‘dur.

>> birim = eye(5,5)

birim =

     1     0     0     0     0
     0     1     0     0     0
     0     0     1     0     0
     0     0     0     1     0
     0     0     0     0     1

>> diagonal = eye(6,5)

diagonal =

     1     0     0     0     0
     0     1     0     0     0
     0     0     1     0     0
     0     0     0     1     0
     0     0     0     0     1
     0     0     0     0     0

 d) Rastgele sayılarla(random) matris oluşturma

0 ile 1 arasında rastgele sayılar seçerek bir rastgele matris oluşturabiliriz. Bu matris kare matris olabileceği gibi herhangi bir boyuttaki matris de olabilir. Kullanacağımız fonksiyon: rand(satır,sütun).

>> rand(5,6)

ans =

    0.3517    0.2858    0.0759    0.1299    0.1622    0.6020
    0.8308    0.7572    0.0540    0.5688    0.7943    0.2630
    0.5853    0.7537    0.5308    0.4694    0.3112    0.6541
    0.5497    0.3804    0.7792    0.0119    0.5285    0.6892
    0.9172    0.5678    0.9340    0.3371    0.1656    0.7482

Not: Gerekirse bu matrisi istediğimiz sayıyla genişleterek sonucumuzun aralığını değiştirebiliriz.

Not2: Bunun dışında randn(satır,sütun) adlı bir rastgele değerlerle matris oluşturan fonksiyonumuz daha var. Bu fonksiyon farklı olarak değerleri -1 ile 1 arasından seçiyor. Bu da doğal olarak negatif değerler sağlıyor. Kullanımı tamamen aynı.

Not3: Bu başlıklarda verdiğim fonksiyonlardan kare matrisler elde etmek için ones(4,4) şeklinde yazmak yerine ones(4) şeklinde bir kullanım mümkün. Yani random(n) yazarsak nxn boyutlarında bir rastgele matris oluşturur.

Matrislerle ilgili tabii ki diyeceklerimiz bitmedi. Ancak bu yazının fazla uzamaması için burda kesiyorum. 8. yazıda altta belirttiklerim olacak. 9. yazıda ise matrislerle yapabileceğimiz işlemlere devam edeceğiz.

Bundan sonraki yazıda bu yaptıklarımızı nasıl kaydedeceğimizi görelim ve vektörlerle ilgili örnek yapalım. Bunları ufak grafiklere dökelim.

Sorularınızı bu konu altından sorabilirsiniz.

 
comments powered by Disqus