Eleman eleman işlem yapma
MATLAB kullanıyorsanız arrayfun, cellfun, spfun ve structfun fonksiyonlarından haberdar olmak işinizi rahatlatabilir. Bu fonksiyonlar en genel anlamda konuşacak olursak, kullandığınız verideki elemanlar üstünde hızlıca işlem yapıp sonuçları yine bir listede oluşturmanızı sağlar. Hemen taze kullandığım bir örnek vereyim:
klasor= '../veri/yuzler/'; dosyaAdlari= arrayfun(@(x) x.name, dir([klasor '*.jpg']), 'UniformOutput', false);
Üstteki örnekte, ilgili klasördeki 'jpg' uzantılı dosya adlarını dosyaAdlari
değişkeninde topluyorum. Bu değişken cell
yapısında. dir
fonksiyonu her elemanı struct
yapısında olan bir dizi döndürüyor. Her eleman, name
isimli alanında dosya adını taşıyor. @
ile başlayan kısım bir fonksiyon tutucu. @(x) x.name
anonim fonksiyonu, içine aldığı elemanın name
alanını döndürüyor.
Bu işi yapmanın birçok yolu olabilir, hatta daha kısası ve sadesi mümkündür ama bu yöntem hoşuma gitti.
Bir örneği de dokümantasyondakinden esinlenerek vereyim:
s.a1 = 'Ocak'; s.a2 = 'Şubat'; s.a3 = 'Mart'; s.a4 = 'Nisan'; s.a5 = 'Mayıs'; s.a6 = 'Haziran'; s.a7 = 'Temmuz'; s.a8 = 'Ağustos'; s.a9 = 'Eylül'; s.a10 = 'Ekim'; s.a11 = 'Kasım'; s.a12 = 'Aralık'; aylarinHarfSayisi = structfun(@numel, s) kisaAyAdlari = structfun(@(x) ( x(1:3) ), s, 'UniformOutput', false)
UniformOutput
parametresi önemli. Eğer doğru olarak verirseniz, sonuçların skaler olacağını varsayıyor ve dönecek verinin bir skaler dizilimi oluyor. Örneğin aylarinHarfSayisi
değişkeni skaler değerlerden oluşan bir dizilim. Fakat kisaAyAdlari
bir cell
dizilimi.
Dizilerin üstünde gezinecek for
döngüleri yazmaktansa bu birebir mapping yöntemi çok daha güzel bir yöntem.
4 yorum
Eleman eleman deyince kaygısızlardaki Eleman geldi aklıma. Çok büyük hayal kırıklığı içindeyim. :)
[Otobüste] - Burcuuu... - Efendim Eleman?! - Şeyyy...Basamakta durma, otomatik kapı çarpar :)
İsmail bu güzel yazının sonrasında senden bsxfun isimli fonksiyon içinde bir yazı bekliyoruz :)
Tamamdır şefim, sırada :)