Eleman eleman işlem yapma - 2
Önceki yazıya takviye olan bu yazıda bsxfun
fonksiyonuna bakacağız. İlk yazıda bahsi geçen fonksiyonlar tek bir dizilimdeki elemanlar üstünde işlem yapmaya yarıyordu. bsxfun
ise iki farklı dizilimde eleman eleman ikili işlem (binary operation) yapıp sonuçları yine bir dizilimde saklamaya yarıyor. Örneğin iki vektörde toplama yapmanın türlü türlü yolu var:
a = [1 2 3]; b = [5 10 15]; a + b ans = 6 12 18 plus(a,b) ans = 6 12 18 bsxfun(@plus, a, b) ans = 6 12 18
Son ifadede kullandığımız bsxfun
'a parametre olarak bir fonksiyon tutucu ve iki adet dizilim verdik. Dizilimler şu türlerden birine ait olabilir: numeric
, logical
, char
, struct
, cell
. Örnekte numeric
değerler kullandık. Bu örnek işlevsel bir örnek değildi, sadece konuyu anlamak için verdim.
Şimdi işe yarar bir kullanıma bakalım. Problemimiz özgün veriden ortalanmış veri (centralized data) elde etmek olsun. Daha net ifade edersek, elimizdeki veri matrisinin her sütunundan (her örneklemden) ortalama sütunu çıkaralım. Mesela eldeki veri şöyle olsun:
A = [2.1 3.2 4.8 2.1 4.8 2.7 5.3 3.4 5.8 -1.1 5.8 3.3 1.8 3.7 0.7 -2.7 1.8 3.2 1.8 5.2 3.8 0.6 0.1 4.8]; plot(A(1,:), A(2,:),'.') grid on axis([-10 10 -10 10])
Özgün veri ortalanmamış görünüyor. Şimdi bsxfun
kullanarak her sütundan ortalamayı çıkaralım ve tekrar çizelim:
A2 = bsxfun(@minus, A, mean(A,2)); plot(A2(1,:), A2(2,:),'.') grid on axis([-10 10 -10 10])
İlk satırda veriyi ortaladık. mean(A,2)
ile sütun ortalamasını bulduk. 2xn'lik bir matris ile 2x1'lik bir vektörü ikili işleme koyduğumuzda matrisin her vektörünü eleman eleman bu vektörle işleme koymuş olduk. Görüldüğü üzere veri ortalandı.
Bir adım daha öteye gidelim ve boyutları normalize edelim. Yani standart sapmaya bölelim:
A3 = bsxfun(@rdivide, A2, std(A2, 0, 2)) plot(A3(1,:), A3(2,:),'.') grid on axis([-10 10 -10 10])
İlk satırdaki std(A2, 0, 2)
kodu ile her satırdaki standart sapmayı hesapladık. İki satır olduğu için sonuç yine 2x1'lik bir sütun vektörü oldu. Bunu std(A2')'
ile de yapmak mümkündü. Ortalanmış veri matrisinin her sütununu standart sapma sütun vektörüne rdivide
ile böldük. Bu fonksiyon "./" ile ifade de edilebilen eleman eleman bölmü yapma fonksiyonu. Sonuç itibariyle iki boyut için de ortalama sıfır, standart sapma 1 oldu. Aradaki çizim fonksiyonlarını atarsak, veriyi iki satırda normalize ettik:
A = bsxfun(@minus, A, mean(A,2)); A = bsxfun(@rdivide, A, std(A, 0 ,2));
Not: Eleman eleman işlem yapmayı anlatırken ikili işlemlerden bahsetmeyi unutmuşum, bu yazı M. Gönen'in tavsiyesiyle ortaya çıktı.