Ö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ı.