anlak.com
Showing posts with label akademi. Show all posts
Showing posts with label akademi. Show all posts

MATLAB değişken ismi değiştirme

, Friday, 10 May 2013
MATLAB 2011b'den beri çok güzel bir özellik varmış da haberim yokmuş. Bir değişken ismini, "Find & Replace" yapmadan, kullandığınız her yerde kolayca değiştirebiliyorsunuz.

Bunun için imleç değişkenin üzerindeyken yeni değişken ismini yazıp Shift+Entera basıyorsunuz.


Yalnız bu yöntemin bazı kısıtları var:
  • İmleç, eşitliğin solundaki ya da fonksiyon argümanındaki değişkendeyken isim değiştirilebiliyor

  • Fonksiyon isimleri, fonksiyonun tanımlandığı yerden değiştirilebiliyor

  • varargin varargout gibi özel anlamı olan isimler değiştirilemiyor
Bu gelişmeler çok güzel ama hala Java ve C# gibi dillerin sunduğu refactor becerilerinin yanına yaklaşmaktan çooook uzaklar.

Bilimsel Yayınlarda İyi Grafikler için 20 Öneri

, Sunday, 10 February 2013
Bilimsel makalelenizde yönteminizi anlatan, sonuçlarınızı özetleyen şekillerin kullanımı çok önemli.
Sözle anlatması uzun, karmaşık şeyleri daha küçük bir alan kullanarak anlaşılır kılar. Bilimsel yayın için iyi grafikler hazırlaması çok kolay bir iş değil maalesef. Bir kurultaya makale yollayacakken laboratuvarımızda dönen muhabbetlerde labdaşlarımın dahi nasıl güzel grafik ve şekil hazırlayacaklarını bilmediğini görmem beni bu derlemeyi yapmaya itti. anlak studios bilimsel makaleleriniz için iyi grafikler üretmek için ipuçlarını sunar [1,2,3,4]:
  1. Bu liste tek bir maddeden oluşacak olsaydı, o madde bu olurdu. Şekilleriniz için mümkünse vektörel formatları kullanın, jpeg ve png gibilerden kaçının. En yaygın ve uyumlu vektörel formatlar eps ve pdftir. Vektörel çizimler sonsuz yakınlaştırma imkanı sunar, böylece baskıda kaliteli görünürler. Fotoğraf için jpeg formatı kullanabilirsiniz.

  2. İlla ki vektörel olmayan bir format kullanacaksanız çözünürlüğünün en az 300dpi olmasına çalışın. Ekranlarınızda gördüğünüz resimler genelde 72dpi'dır baskıda bulanık ve çirkin görünürler.

  3. Şeklinizi belgenize ekledikten sonra yeniden boyutlandırmayın. Editörünüz içinden şeklin boyutunu değiştirince dpi değişir, baskıda çirkin görünür.

  4. Şeklinizi yeniden boyutlandıracaksanız en boy oranını koruyun. En boy oranı korunmayınca şekil söbü, özensiz ve berbat görünür. Resim editörlerinin çoğunda yeniden boyutlandırırken en boy oranını korumanın yolu SHIFT tuşunu basılı tutmaktır.

  5. Okunaklı fontlar kullanın. Grafiklerde Helvetica, gibi çentiksiz (sans-serif) fontlar güzel görünür. Benim şahsi favorim Calibri.

  6. Şekillerin üzerindeki yazıların baskıdan sonra okunabilir boyutta olduklarından emin olun.

  7. Grafiklerinizin arkaplanı beyaz olsun. Örneğin, Excel'in eski sürümlerinde grafiklerin arkaplanı sevimsiz gri oluyor. Bunları hep beyaza çevirin.

  8. Kılavuz çizgilerden (gridline) kaçının. Kullanacaksanız da siyah olmasın, açık gri olsun, göze batmasın.

  9. Eksenlerinizin limitlerini, veri noktalarınız/çizgileriniz çevresinde boş alanlar en az olacak şekilde ayarlayın.

  10. Birimleri yazmayı unutmayın.

  11. Eksen üzerindeki işaretler (tick) küsuratlı sayılarda değil, yuvarlak güzel sayılarda olsun.

  12. Eksenleri isimlendirmeyi de unutmayın. (ilkokuldan beri söyleniyor bu. lütfen. rica ediyorum.)

  13. Yazılar grafikteki başka öğelerin üzerine gelmesin.

  14. Tufte'nin önerisini dinleyip, ıvır zıvırlardan kurtulun. Veri-mürekkep oranınızı yüksek tutun.

  15. Şekilleriniz ve altındaki açıklama yazısı anlamak için yeterli olsun. Okuyucu dönüp metne bakmak zorunda kalmasın.

  16. Altın oran güzel görünür. Yapabiliyorsanız en-boy oranı 1.618 civarında olsun.

  17. Grafiklerinizde verinin sırası önemli değilse çizgi değil nokta kullanın.

  18. Grafikler karşılaştırılabilecekse ölçekleri aynı olsun, hatta daha da iyisi hepsini tek bir grafikte gösterin.

  19. Verinizi anlaşılmaz kılmak istiyorsanız pay grafiği (pie chart) kullanın!

  20. Makalenizi okumak isteyenler, çıktısını neredeyse her zaman siyah beyaz alacaklardır. Veri gruplarını farklı renklerde gösterdiyseniz, siyah beyaz basıldıklarında da ayırt edilebilir kılın. Veri grupları için nokta/çizgi stilini değiştirerek bunu sağlayabilirsiniz.
Son olarak MATLAB kullanıyorsanız exportfig ya da export_fig öneririm. Bu fonksiyonlar, ürettiğiniz grafikleri, yukarıda saydığım önerilerin bir kısmına uygun (vektörel, siyah beyaz uyumlu vs.) şekilde baskıya hazır hale getiriyor. Benim sevdiğim exportfig.

Kaynaklar:
[1] Ben
[2] Twenty rules for good graphics
[3] What best practices should I follow when preparing plots?
[4] Rob Hyndman yorumu

Kitapçık çıktısı ile pdf okumaca

, Thursday, 31 May 2012
Ekrandan uzun süre yazı okumak çok göz yorucu bir eylem. Ekranın parlaklığını kıssanız da, yazının arkaplanını koyu renge ayarlasanız da doğası gereği ışık saçan bir cihaza bakmak yorucu. Ayrıca yanınızda tabletiniz yoksa yanınızda taşıyıp orada burada okuyamıyorsunuz da. İdeal kombinasyon Kindle gibi görünse de fiyatı nedeniyle tercih etmeyebilirsiniz. Ya da sadece işleri basit tutmak adına geleneksel kağıdı tercih ediyorsunuzdur. Hem kenarına not alabilirsiniz. Üzerini istediğiniz gibi istediğiniz biçimde karalayabilirsiniz. Sık sık teknik döküman, bilimsel makale okumam gerektiğinden, baskıda okumayı kolaylaştıracak faydalı bulduğum bir yöntemi yazayım istedim.
Bunlardan birincisi kitapçık (booklet) çıktısı almaca. Kitapçık çıktısı aldığınız zaman 2 sayfa tek sayfaya basılıyor, sayfaları ortadan katladığınızda kitap okur gibi sadece sayfaları çevirmeniz yetiyor. Kitapçık çıktısı alma seçeneği pdf gösteren popüler programlardan maalesef bir tek Adobe Reader'da var. Eğer yazıcınız otomatik olarak kağıdı ters çevirip arkasına da basabiliyorsa ne ala; eğer yazıcınız yeteneksizse, bir tarafın baskısı bittikten sonra kağıtları belli şekilde çevirip yazıcıya geri koymanız lazım. Doğru yapana kadar bir kaç defa denemeniz gerekebilir.

Bilimsel makaleler çoğunlukla çift sütuna küçük puntolu yazılarla yazıldığı için genelde sayfa doluluk oranı yüksek oluyor, bunları kitapçık şeklinde basmak harfleri minicik yapıyor, okunmaz kılıyor. O yüzden tek sütunlu belgeler için kitapçık çıktısı daha uygun.

Bazı belgelerin marjinleri ise çok geniş oluyor, kitapçık çıktısı aldığınızda gene yazılar miniminnacık kalıyor. Bunun için pdf kırpmaya yarayan şirin bir programcık var: Briss. Donation yaptığım nadir uygulamalardandır kendileri. Yaptığı iş basit, bir o kadar da mühim. Verilen pdfteki sayfaları üstüste bindirip, kırpma olanağı sunuyor, bir nevi ozalitçinin giyotinle yaptığı işi yapıyor. Briss kullanarak sayfalardaki geniş marjinlerden kurtulduktan sonra kitapçık çıktınız çok daha şık görünecektir. Hatta mobil cihazda okumak için çift sütünlu makalelerin her bir sütununu ayrı ayrı da kırpabilirsiniz. Ayrıca Briss Java'da yazıldığı için her platformda çalışabiliyor. Aşağıda geniş marjinli bir dökümanı Briss ile kırpıp kitapçık çıktısının alınmış halini koydum, nasıl da davetkar duruyor.



Briss web sayfası: http://briss.sourceforge.net/

Using OpenCV 2.3.1 with Visual Studio 2010 (tutorial)

, Tuesday, 27 September 2011
There is a newer version of this document: Using OpenCV 2.4.x with Visual Studio 2010

Here in this tutorial I am going to show how to configure Visual Studio 2010 to use OpenCV 2.3.1 in your computer vision projects. Also, I am going to write a couple of lines of code to show new OpenCV C++ API.

By the time the tutorial was written the latest version of OpenCV was 2.3.1. The methods described below should, but may not, work for different versions. This tutorial targets computer vision course students at Computer Engineering in BOUN, but I will be generalizing as much as I can, so everyone can enjoy it.

Foreword

Before starting I would like to suggest a couple of things.

First, if you are ever going to write C++ code, read Effective C++, 3rd edition by Scott Meyers (CAUTION! 2nd edition is outdated, it is not worth reading imho). This book has many topics on how to write correct, working, easily maintainable C++ code. I see lots of boilerplate code around when it comes to C++, not only reading this book will reduce such practices, it will save you time. Besides, you will feel healthy mind-wise :) If there was to be only one book on C++, and the rest was to disappear, I would select this book. Be careful though, this book is *NOT* for beginners, you need to know a little bit of C++ to understand what it means.

For BOUN students who are taking Computer Vision course, the book is available as an electronic resource in the library.

Second, Google has really good guidelines on different programming languages, including C++. Although they are specialized for their internal use, I recommend following those guidelines. The guideline provide the motivation behind the rules, so it is also great place to learn how to write C++ properly. Again, it is not a place to learn C++, but to master C++.

Preparation

Make sure that you have Visual Studio 2010 (VS2010) installed.

For BOUN students, it is available in license server. I don't quite know the details, you may need to work it on your own.

Download OpenCV 2.3.1 and extract the contents to a folder. I prefer to put directly under root like "C:\OpenCV-2.3.1\".

Optionally, I recommend using Visual Assist X to write and refactor code easily.

Configuring VS2010

There are a couple of ways to configure Visual Studio 2010, I am going to show a way which I find convenient. We are going to configure it using property sheets. Whenever we need to create another project, we just need to add same property sheets to new project. Let's start.

Launch VS2010 and select "New project...".

Select "Empty Project", enter "hello-opencv" as Name, select a location to place project. I also prefer, for simplicity, not creating directory for solution so I unchecked that option. See the image below.

When done, press "OK".

Now we have created a project from scratch. It is time to link the libraries and make our project use OpenCV.

Switch to Property manager by clicking on the tab below.

The default properties are for 32-bit systems (note the Win32 suffixes), because I am using 64-bit system, from now on I am going to describe the configuration for 64-bit systems.

From the "Build" menu, select "Configuration Manager". Under "Active solution platform" Win32 should be selected by default. Click on it and select "New...".

Select "x64" as the new platform and select Win32 to copy settings from. Make sure that "Create new project platforms" is checked.

Now your Property Manager view should look like this:

Select the Win32 configurations and delete them, you won't be needing those. Let me remind this one more time, these steps are only required if you are using 64-bit system and want to develop 64-bit applications.

To add a property sheet right click on "Debug | x64" and select "Add New Project Property Sheet". This property sheet will/should only include the details on how to link the OpenCV library to our project. Once this is done, the property sheet can be shared between projects on the same computer.

On the add new property sheet dialog, I entered "OpenCV-Debug" as the sheet name, because this sheet will link debug libraries. After pressing "Add" the new property sheet will show up in Property Manager. Double click on it, a dialog with lots of properties will be shown.

Under "Common Properties" -> "C/C++" -> "General", edit "Additional Include Directories" and add "C:\OpenCV-2.3.1\build\include". Of course don't forget to change the path accordingly if you have put OpenCV files to a different place. It is important that you select the "include" folder under "build" folder, not any other "include" folder.

Under "Common Properties" -> "Linker" -> "General", edit "Additional Library Directories" and add "C:\OpenCV-2.3.1\build\x64\vc10\lib". I won't tell you to change the path to your OpenCV path next time :) Here "x64" stands for 64-bit systems, if you are using 32-bit change it to x86. "vc10" stands for Visual C++ 2010, leave it as it is assuming you are using VS2010.

Under "Common Properties" -> "Linker" -> "Input", edit "Additional Dependencies" and add the following lib files:

opencv_calib3d231d.lib
opencv_contrib231d.lib
opencv_core231d.lib
opencv_features2d231d.lib
opencv_flann231d.lib
opencv_gpu231d.lib
opencv_haartraining_engined.lib
opencv_highgui231d.lib
opencv_imgproc231d.lib
opencv_legacy231d.lib
opencv_ml231d.lib
opencv_objdetect231d.lib
opencv_ts231d.lib
opencv_video231d.lib


Actually you won't probably need all the libraries. Linking the only necessary ones may make linking operation a little bit faster but for our case, that speed up is not worth the effort. Note the letter "d" in filenames just before the dot, that "d" stands for "Debug".

The steps are the same for "Release" configuration except the linked library filenames. You just need to get rid of the "d" letters before the dot. Debug libraries includes additional instructions for debugging purposes such as variable watching, and they are not optimized. This makes debug libraries run slower. When you are dealing with lots of data or you just need more processing power you should switch to release configuration which is free of extra instructions and optimizes your code, hence runs much faster.

Hello OpenCV

OK. Now we are (almost) ready to write our first lines of code. Switch to "Solution Explorer" by clicking the tab below. Right click on "Source Files", select "Add" -> "New Item...". Select "C++ File" from the menu and type "main" as name.


Insert the following lines into the main.cpp and run the code (press F5).

#include <opencv2/opencv.hpp>

using namespace cv;

int main()
{
    Mat img(Mat::zeros(100, 100, CV_8U));

    imshow("window", img);

    waitKey();

    return 0;
}

You should get an error about a missing dll. Locate "hello-opencv.exe" in your project folder. Copy the dll files (preferably the ones that ends with letter "d") from "C:\OpenCV-2.3.1\build\x64\vc10\bin" to that folder.

By the way, using full namespaces like "using namespace cv;" is discouraged. I recommend using "using cv::Mat;", this will prevent name collisions and make the code more maintainable. See this discussion for details.

Some people prefer adding these dll into PATH environment variable, I prefer my projects to be self sufficient. It is good to be in control of which dll the project is using. If you are dealing with multiple projects using the different versions of the same library, if the dll names are the same, PATH approach will not work.

Run the code again. It should work fine and display a 100x100 black image in a window. If not that means there is a problem that you need to figure out. Try until you solve that problem.

Now modify the main.cpp so it is like:

#include <opencv2 /opencv.hpp>

using namespace cv;

int main()
{
    Mat img;
    VideoCapture cap(0);

    while (true)
    {
        cap >> img;

        Mat edges;
        cvtColor(img, edges, CV_BGR2GRAY);

        Canny(edges, edges, 30, 60);

        imshow("window label", edges);
        waitKey(1);
    }

    return 0;
}

The code above needs a webcam connected to the computer, it captures images from a camera.

And run the code. You should get a missing "tbb_debug.dll" error. This is a bug of OpenCV-2.3.1. It should be shipped with tbb_debug.dll but it is missing in the package. That dll is the part of Threading Building Blocks project by Intel, you should download the latest version from here. The zip file that you have downloaded contains the dll, and you should copy that dll to the same folder under your project like other dlls (same directory as hello-opencv.exe).

Now run the code again. "Canny" is an edge detection algorithm, if the program runs well, you should see the detected edges of the captured image.


This completes our tutorial.

Closure

The documentation of OpenCV is quite good. Use it extensively.

I highly recommend using new OpenCV C++ API. The new API is clean, slick and well-designed. Avoid using old API, e.g. IplImage, unless you really know what you are doing. There are lots of information on internet about OpenCV which is outdated, beware of those. Always use the latest official documentation first.

Çalışma kültürü

, Friday, 9 September 2011
Burada study dedikleri bir kavram var. Öğrencilerin gidip birlikte çalışabilecekleri ortak çalışma alanlarına verilen isim study. Örnek cümle içinde kullanımı: "Madem öyle yemekten sonra study'ye gideriz". Kütüphane'nin giriş katında ayrı bir bölümde büyük bir study var, bir de benim gördüğüm bölüm binalarının içerisinde de küçük küçük study'ler var.

Eski laptopum çok külüstür olduğundan fişe takılmadan çalışmıyor, bir keresinde acil laptop açıp internete bağlanmam gerekti, o zamanlar da bi lab'da çalışmadığım için mekansızım, kütüphaneye girip kurulmak zor geldiğinden bölümdeki study'ye giriverdim.


İçerisi öğrenci evi bozması bir oda, ortada masalar sandalyeler, duvar diplerinde çiçek desenli, kirli kanepeler, boş duvarlar. Buraya ne zaman baksam içeride insanlar görüyordum, merak da ediyordum. Bir yanda uzay mekiği üzerine konuşan ufak bir grup var. Diğer tarafta tıkır tıkır kod yazıp ödev yapan çömezler. O sırada muhtemelen sınavı olduğu için bir gün önceden uyumamış her bölümün olmazsa olmazı bıyıklı kel, benden dahi yaşlı gösteren bi öğrenci geldi kanepelerden birine uzandı uyumaya başladı.

Study'ler sadece ders çalışma alanları olmaktan çıkmış, öğrencilerin sosyalleştiği alanlar haline de gelmiş, ki bu acayip sevindirici. Çünkü çalışmayı inanılmaz teşvik ediyor, içeriye girince hem çalışıyorsunuz hem eğleniyorsunuz. Bir nevi garaj bu study'ler. Study'lerin dışında bölümün içerisinde de benzer bir anlayış var, bölüm binasının girişindeki koltuklarda da her daim çalışan, muhabbet eden öğrenciler var.

Study'ler sadece bir örnek. Boğaziçi Üniversitesinde her alanda çalışmaya teşvik ediliyorsunuz ve bu zorlama olarak değil bir yaşam biçimi olarak hayatınıza nüfuz etmeye başlıyor. İTÜ ile gördüğüm en büyük fark bu herhalde, İTÜ'de çevre koşulları sizi bir yöne itmiyordu, bireysel çabalarınızla ayakta tutmalıydınız çalışma kültürünüzü. Başka bir deyişle kendinize ya da başkasına faydalı olmanızı sağlayacak maddi ve manevi koşullar sağlanmıyordu. Benim zamanında olduğum gibi, çalışmaya niyetiniz yoksa gayet tembel bir öğrenci olarak hayatta kalabiliyordunuz. Bunun İTÜ'de gerçekleşmemesinin nedeninin maddi olduğunu da zannettmiyorum, benzer fiziksel ortamlar yaratmanın maliyeti çok değil (çirkin masa ve sandalye neticede).

Boğaziçi Üniversitesi, hadi genellemeyeyim, Bilgisayar Mühendisliği bölümü bu şekilde bir çalışma kültürü oluşturduğu için çok doğru yapmış. Bu kadar ünlü olmasının altında bu kültürün önemli payı var (geldiğimden bu yana ününü de hakettiğini gördüm, o da ayrı). Bu kültür sayesinde güncel kalabiliyor, başarılı işler ortaya koyuyor ve bu iyi niteliklerin insanlar arasında yayılmasını sağlıyor.

Fotoğraf: Cliff http://www.flickr.com/photos/nostri-imago/2866399803/

Pragmatik Araştırmacı

, Saturday, 20 August 2011
Akademiye geçmeden önce bir süre özel bir şirkette çalışmıştım, orada çevik (agile) metodları benimsemiştik. Farkettim ki piyasadaki durum, öğrenci olarak yapılması gerekenlerle pek fazla örtüşmüyor. Bunun başlıca nedeni öğrenci iken bakımı yapılacak şekilde bir ürün üretmiyorsunuz. Örneğin yaptığınız ödevler tek seferlik; bir kere öyle ya da böyle çalışır birşey elde ettikten sonra sonuçlarınızı elde edip yazdığınız kodları bir daha yüzüne bakmamak üzere rafa kaldırıyorsunuz. Araştırma yaparken durum birazcık daha farklı, yazdığınız kod üzerinde biraz daha uzun süre uğraşıyorsunuz , kodları elinizde biraz daha uzun süre tutuyorsunuz, fakat tecrübe ettiğim kadarıyla sonuç pek fazla değişmiyor, kodlar iş bittikten sonra bir köşeye terk ediliyor. Bu yüzden akademideki kod kalitesi bazı istisnalar (ör. Zemberek) dışında oldukça düşük.

Uzun süren araştırmalar bu duruma pek uymuyor, tez gibi uzun soluklu çalışmalarda mecburen kodunuzun bakımını yapmanız gerekiyor. Kimse yapmıyor o ayrı mesele. Yazdığınız kodu güzel yazmadıkça, bakımını yapmadıkça teknik borç (technical debt) birikiyor. Bu borç kısa vadede ilerlemenizi sağlayan fakat orta vadede size ayakbağı olacak eylemlerinizi açıklayan bir kavram. Bugün az bir emek harcayıp kodunuzu güzelleştirmek, ya da bir şeyi doğru şekilde yapmak yerine günü kurtarırsanız, daha sonra atacağınız adımlar daha da güç olacaktır. Az evvel dediğim gibi akademide yazılan kodlar çok kısa ömürlü olduğu için bu pek sorun olmuyor.

En azından makro ölçekte bu böyle. Son dönemlerde deneyimlerim ödevlerin, projelerin kısa ömürlü olmasına rağmen güzel programlama pratiklerine ihtiyaç duyduğu yönünde. En son arkadaşımı benim 1 günde bitirdiğim yapay sinir ağı ödevi için 3-4 gün harcamasını gördüğüm zaman farkettim bu durumu. İşlerimizi kolaylaştıracak yöntemlerin başında temiz kod yazmak geliyor. Temiz kod yazmanın, kısa süreli projeler olsa dahi, hayatımızı nasıl daha güzel kılacağını bir örnekle tarif etmeye çalışayım.

Diyelim ki $w_{i2}x+w_{i1}$ gibi bir ifadenin sonucunu sigmoide sokacağız, bu işi halletmenin MATLAB'da en düz yolu:
   y = 1 ./ (1 + exp(-x.*w(i, 2) + w(i, 1)));

Benim tercih edeceğim yol:
   y = sigmoid(x.*w(i, 2) + w(i, 1))

   function ret = sigmoid(x)
      ret = 1 ./ (1 + exp(-x));
   end

Sigmoid'i fonksiyon olarak ayrıştırarak
  1. Yeniden kullanılabilirliğini arttırdık. Bu örnekte, yapay sinir ağlarıyla uğraştığımızdan, birden fazla yerde sigmoid'i gönül rahatlığıyla kullanabiliriz. Her defasında yeniden aynı ifadeyi yazmakla uğraşmayız.
    Sigmoid'i yazarken bir yanlışlık yaptıysak dahi, bu yanlışlığı her yerde düzeltmemiz gerekmez. Sadece bir yerde düzeltmemiz yeterli olur. Diğer türlü sigmoid ifadesinin geçtiği her yeri bulmaya çalışırken gözümüzden bir kaç tanesini kaçırmamız çok olası.
    Hatta bunun bir adım ötesi, yavaş yavaş kendi kullanacağınız kod parçacıklarını kütüphaneleştirme yoluna gitmek olur. İleride size avantaj sağlayacaktır. Doğrudan kendi deneyimimi paylaşayım. Bir dönem projesi için çeşitli uzaklık metriklerini ($\chi^2$, Bhattacharaya, Kolomogrov vs.) implement etmiştim. Bir sonraki dönem başka bir dersin hocası verilen ödevde kullanacağımız her farklı uzaklık metriği için bonus puan vereceğini söyledi. Hiç uğraşmadan elimdeki hazır yazılmış 3-5 metriği çaktım geçtim.

  2. İfade daha anlaşılır oldu. Anlaşılır olması tekrar geri dönüp baktığınızda ilgili ifadede ne olup bittiğini çabucak kavramanızı sağlar. Anlaşılır kılarken ayrıca bug oluşumunu da engellersiniz aslında. Verdiğim kötü örnekte aslında bug var, exp() içine alırken, "-" toplamın iki elemanını da negatiflemeliydi, yani ifade y = 1 ./ (1 + exp(-x.*w(i, 2) - w(i, 1))); olmalıydı. Gördüğünüz gibi  böylesi "obscure" durumda hata yapmak daha kolaylaşıyor, hatayı bulması da zorlaşıyor. Sigmoid'i ayrı bir fonksiyon olarak yazdığımız durumda hata çabucak gözümüze çarpardı.

Bazıları önerdiğim yöntemin, fonksiyon çağrıları ve pass-by-value yüzünden daha yavaş olduğunu söyleyecektir, hele ki akademide mikro optimizasyonlar oldukça önemli olabiliyorken. Pragmatik programcılığın altın kurallarından biri de
  1. Profile et

  2. Darboğazı bul

  3. Optimize et
der. Profile etmek, kodunuzdaki ifadelerin hangilerinin koşmasının ne kadar zaman aldığını ölçmektir. Yıllardır yazdığım kodların hiçbirinde (abartmıyorum, 1 tanesinde bile olmadı bu) darboğaz tahmin ettiğim yerde değildi, ve bu tip mikro optimizasyonlar performansa hiç katkıda bulunmadı. Ayrıca, modern diller, hatta hantal MATLAB, bile kodlarınızı sizin için derlediğinizde ya da hemen koşturmadan önce optimize edebiliyor. awesome engineerO yüzden mutlaka ilkin profile edin ve kodunuz en çok zamanı nerede harcıyormuş onu bulun ve orayı hızlandırmaya çalışın.

Son olarak MATLAB'a özel bir tüyo vereyim, yıllardır MATLAB yazan insanların kodlarında bile görüyorum bu kötü uygulamayı. Matris işlemleri yaparken for döngüsü kullanmayın, kodunuzu vektörize edin. Vektörize etmek kodunuzu daha anlaşılır kılar, çünkü matematiksel ifadeleri neredeyse aynı şekilde ifade etmiş olursunuz hem de kodunuz hızlanır. Çünkü MATLABda array elemanlarına erişim oldukça maliyetli. Gerçi son dönemki MATLABdaki değişiklikler (JIT-accelerator), döngüler ve vektörizasyon arasındaki farkı önemsiz kulabiliyor.Yine de benim önerim kodunuzun güzelliği ve aklınızın sağlığı açısından vektörizasyon kullanmanız.