5 – Tanımlanan Değişkenleri, Türlerini Listeleme ve Stringler

Daha önceki yazılarda Matlab üzerinde birçok değişken tanımlayıp bunlarla basit işlemler yapmıştık. Şimdi, tanımladığımız değişkenlerin bir listesini görmek istediğimizde, ya da herhangi bir filtreleme uygulayarak görmek istediğimizde (mesela, “a” ile başlayan değişkenler gibi) neler yapmamız gerektiğine bakalım. Ayrıca, stringler ile ilgili de ufak bir giriş yapacağız, nedir, nasıl tanımlanır bir inceleyelim.

İlk olarak, elimizdeki değişkenleri nasıl listeleyeceğimizi görelim. Tabii ki bunu yapmadan önce birkaç değişken tanımlamak gerekiyor.  Değişkenleri listelerken who ifadesinden yararlanıyoruz. Burada incelediğimizden daha detaylı bilgiyi her zamanki gibi help who komutu vererek edinebilirsiniz. Lafı daha fazla uzatmadan, ufak bir örnek üzerinde görelim:

>> a = 3

a =

     3

>> b = 4

b =

     4

>> who

Your variables are:

a  b

Gördüğümüz üzere, çıktıda Your variables are: ifadesinden sonra elimizdeki değişkenler listeleniyor. Şu an listelemeyi yaptık, ancak diyelim ki elimizde 300 adet değişken var ve aralarından s ile başlayıp 3 hane daha içeren, yani 4 karakterli ve s ile başlayan bir değişken bulmak istiyoruz. Bunu yapmamız için, önce istediğimiz karakterle başlayan değişkeni bulalım, daha sonra da 3 haneyi nasıl ekleyeceğimize bakalım.

who ifadesi ardından kullanacağımız parametrelerle elde edeceğimiz çıktıya şekil verebiliriz. Öncelikle, sali isimli bir değişken oluşturup 15 değerini verelim.

>> sali = 15

sali =

    15

Şimdi de, who ifadesine s ile başlayan değişkenleri bulması için vereceğimiz komutu verelim ve bu komut hakkında bilgi vermeye çalışalım. Öncelikle, komutumuz ***** karakteri. Yazmamız gereken kod ise şöyle bir hal alıyor:

>> who s*

Your variables are:

sali

Şimdi biraz daha genişletip, s ile başlayan ve “li” ile biten bir değişken olarak ele alalım ve bu değişkeni nasıl bulacağımıza bakalım. Aslında mantığımız hala aynı. Biraz önce açıklayacağımızı söylediğim yere şimdi geldik. * karakteri, birçok programlama dilinde düzenli ifadeler(regular expressions, regex ya da re olarak geçer) konusunda da benzer işlevlere sahiptir. (“düzenli ifadeler*: yazıları seçmek için filtreler oluşturmamıza yarar”) Tanım için Fatih‘e teşekkürler:) Yani araya karakter gelebilmesi için kullanılan belirteçler arasındadır ve özel bir anlam ifade eder. Bu konuda ayrıntılı bilgi için ufak bir Google araması yapabilirsiniz. Şimdi kodumuzu görelim:

>> who s*li

Your variables are:

sali

Peki, aradığımız değişken yoksawho ifadesi bize ne döndürür? Hemen deneyelim:

>> who s*lil
>>

elimizde s ile başlayan ve lil ile biten bir değişken olmadığı içinwho komutu boş sonuç döndürdü ve komut satırı yeni komutu beklemeye başladı.

Bu ifadenin sonuçlarının işimize nasıl yarayabileceğiyle ilgili ufak bir örnek yapalım. Elimizdeki değişken isimlerini görebiliyor olmak belki pek bir şey ifade etmiyor ancak onları yazı olarak kullanabilmek işimize yarayabilir. Yani değişken isimlerini ekrana bastırırken bunu kullanabiliriz. Örnek olarak, elimizdeki**** değişken isimlerinin bir listesini yapmak istediğimizi varsayalım ve bunu nasıl yapacağımıza bakalım. Öncelikle, who ifadesinin döndürdüğü sonucu bir değişkene atarsak, elimizde bu isimleri içeren bir liste olur. Hemen bir örnek üzerinde görelim:

>> liste = who

liste = 

    'a'
    'ans'
    'b'
    'liste'
    'sali'

Gördüğümüz üzere, elimizde 5 tane öğesi olan bir liste var. Şimdi bu listeyi biraz daha detaylı inceleyelim.

Listemiz içerisinde ‘sali’ isimli bir değişken ismi içeriyor. Burada aslında string olarak belirttiğimiz yapı mevcut. Yani string, bizim yazı diye tabir edebileceğimiz ifadelerin programlama dilindeki karşılığını oluşturuyor. Yukarıda bahsettiğimiz regular expressions olayının da stringler üzerine döndüğünü belirtelim. Peki başka stringler tanımlamak istersek ne yapmalıyız?

Öncelikle, başka bir programlama diliyle uğraştıysanız, tırnak işaretlerinin tutarlılığının önemini biliyorsunuzdur. Ancak Matlab üzerinde string tanımlarken tutarlılık kuralını uygulamak sorun yaşatabilir, zira Matlab yazıları tek tırnak içerisinde istiyor. Hemen görelim:

>> string = "Yazi"
 string = "Yazi"
         |
Error: The input character is not valid in MATLAB statements or
expressions.

>> string = 'Yazi'

string =

Yazi

Bu yüzden tırnak işaretlerine dikkat etmemiz önemli.

String’lere giriş için bu yeterli sanıyorum. İleride karşımıza çok daha detaylı kullanımları zaten çıkacak. Şimdi isterseniz, az önce liste olarak belirttiğimiz kavramı mercek altında tutalım.

Aslında orda tanımladığımız değişkenin türü bir liste değil, matristi. Çünkü Matlab’da o işi gören yapılar matrislerdir. Birden çok öğeyi satır ve sütunlara dizeceksek kullanacağımız yapılar matrisler olacak. Ayrıca, tek satırsa veya tek sütunsa da yine matris olarak değerlendirmemiz mümkün. Zaten kullanımda vektör dediklerimiz de bildiğimiz üzere tek boyutlu matris olarak geçiyor. O halde, şu an elimizde tek boyutlu bir matris var. Biz bu matris içerisinden istediğimiz öğeyi almak istiyoruz. Burada devreye matrislerin indisleri geliyor. Yani bir matrisin istediğimiz öğesini gösterirken, bildiğiniz üzere satır ve sütun numarasından faydalanıyorduk. Burada matrisimiz tek sütundan oluştuğu için, sadece satır numarasını göstermemiz yeterli olacak. Onun için de devreye oldukça basit olarak faydalanabileceğimiz parantez işaretleri gelecek. Diğer programlama dillerinde listeler veya dizilerle çalıştıysanız, onların indisleri 0’dan başlıyordu. Matlab ile çalışırken burda da bir değişiklik var. Normalde matematikte yaptığımız indisleme geçerli oluyor ve satır ve sütun numaraları 1’den başlıyor. 0 yazarsanız sorun alıyorsunuz. Şimdi birkaç örnek yapıp ne demek istediğimizi daha iyi anlayalım:

>> x(1)

ans = 

    'a'

>> x(3)

ans = 

    'b'

>> x(2)

ans = 

    'ans'

>> x(4)

ans = 

    'liste'

Bunda zaten bildiğimiz lineer cebir kuralları geçerli olduğu için sorun yaşamayacağımızı varsayarak devam ediyorum. Sorunuz olursa konu altından sorabilirsiniz. Ayrıca, artık değişken isimlerini bir matrise atayıp sonra istediklerimizi nasıl çekeceğimizi de biliyoruz.

Değişkenlerimizin isimlerini who ile alıp yanına eklediğimiz * karakteri ile istediğimiz başlangıç ve bitişi içeren değişkenleri listeleyebiliyoruz. Yukarıda yapacağımızı söylediğim, 4 karakter içeren bir değişken ismini nasıl bulacağımıza bakalım.

>> who -regexp ^s\w{3}$

Your variables are:

sali

Şimdi bu kodu inceleyelim. Öncelikle, daha önce de bahsettiğimiz gibi regular expressions, yani düzenli ifadelerin işin içine girdiğini -regexp ifadesinden anlıyoruz. Daha sonrası ise bu konunun detaylarından. Konuyu ilerleyen zamanlarda oldukça detaylı olarak işleyeceğiz ancak burda kullandığımız ifadeleri kısaca açıklayalım.

^ ifadesi stringin başında arama yapmaya yarar. Yani ^ ifadesinden sonra gelen harf aradığımız değişkenin en başında olursa eşleşme gerçekleşir. Burada s ile başlayan sali adlı değişkeni aradığımız için ^s yazımını kullandık.

Daha sonra yazdığımız \w ifadesi ise bize w harfini ifade etmiyor. Buradaki ** ters slash işareti kaçış karakteri olarak duymuş olabileceğiniz, yanındaki karakterin beklenenden farklı bir anlamı olduğunu belirtiyor(belki biraz kaba bir tabir oldu ancak şu anlık yeterli). Burada help regexp ile daha detaylı listesine ulaşabileceğiniz belirteçlerden birini kullandık: \w belirteci. Bu, listede belirtildiği üzere, a-z_A-Z0-9 aralığındaki bütün karakterleri kabul etmeye yarar. Yani nokta ve virgül gibi ifadeler dışındakileri alır. Değişkenlerde bunları zaten kullanamıyoruz ancak ileride yazılar üzerinde bu işlemleri yaparken kullanacağız.

Hemen \w ifadesinin yanında yer alan {3} ifadesi ise kendinden hemen önce belirtilen ifadenin kaç kere aranacağını söylüyor. Köşeli parantezler içerisine 3 yazdığımız için, \w ile belirtilen ifadeden 3 tane arıyor. Yani harf ya da sayıdan 3 tane bulursa sonuç döndürüyor.

$ ifadesi ise elimizdeki ifadenin sonunu, bitişini belirtiyor. Yani $ koyduğumuzda, diğer şartlar sağlanıyorsa bile eğer elimizdeki yazı henüz bitmemişse(burada yazı değişken isimleri oluyor) bize sonuç vermiyor.

Şimdi işleyeceğimiz son konu olan whos ifadesine bakalım. Bu ifade, bize değişkenlerin sadece isimlerini değil, aynı zamanda boyutlarını, kapladıkları bayt cinsinden alanı ve türlerini de döndürür. Matlab ve Python ile çalışırken değişken türlerini tanımlama esnasında belirtmediğimiz için bazı zamanlarda oldukça işe yarayan bir işlev(not: python’da tür almayı type() fonksiyonuyla yapıyoruz). Şimdi ufak bir örnek yapalım:

>> whos
  Name        Size            Bytes  Class     Attributes

  a           2x5                80  double              
  ans         1x1                70  cell                
  b           1x1                 8  double              
  liste       3x1               192  cell                
  sali        1x1                 8  double              
  string      1x4                 8  char                
  x           5x1               328  cell

Ayrıca, whos ifadesini de who gibi düzenli ifadelerle kullanabiliriz:

>> whos -regexp ^s\w{3}$
  Name      Size            Bytes  Class     Attributes

  sali      1x1                 8  double

Bir değişkene de atayabiliriz, yalnız bunun çıktısı dizi(array) türünde oluyor, dikkat etmemiz gerekli:

>> degisken = whos

degisken = 

7x1 struct array with fields:
    name
    size
    bytes
    class
    global
    sparse
    complex
    nesting
    persistent

Fazlasıyla uzun oldu. Sorularınızı bu başlık altında sorabilirsiniz.

 
comments powered by Disqus