Matlab İle Grafik Arayüzü Oluşturma

Matlab ile bu işi yapmak çok zor değil, aslında çok kolay.. Sadece biraz oturup karıştırmak ve en önemlisi biraz meraklı olmak lazım. Matlab ile bu tür uygumalar yaptığınızda daha önce Visual Basic kullandıysanız aynı şekilde Grafiksel bir arayüz oluşturabilirsiniz. VB'ye göre Matlab'ın matematiksel fonksiyonlarıyla da gelişmiş programlar yazabilirsiniz.

Matlab'da GUI (grafik kullanıcı arayüzü) başlatmak için Matlab komut satırına " >>guide " yazın. Karşınıza aşağıda görüldüğü gibi GUIDE QUICK START ekranı çıkacaktır.
Bu ekrandan " Blank GUI " seçerek yeni bir tane uygulama başlatıyoruz.
Açılan Pencerenin sol tarafında yer alan tool'ları kullanarak programımızın arayüzü için belirlenen alan üzerine PUSHBUTTON, EDITTEXT, RADIO BUTTON gibi elemanları istediğiniz gibi yerleştirebilirsiniz. Fakat bu yerleşimi yaparken dikkat etmeniz gereken bir durum var ki buna dikkat ederseniz program yazarken çok rahat edersiniz.

Yerleştirdiğiniz elemanın üzerine çift tıkladığınızda " Property Inspector " penceresi açılacaktır. Bu pence25.10.2008liyorsunuz. En basitinden mesela butonun rengini değiştirebilirsiniz... Burada renkten ziyade elemanın " Tag " kısmında default olarak belirlenmiş olan ismidir. Mesala eklediğiniz bir butonun TAG kısmında " pushbutton " yazar. Programda birçok buton varsa pushbutton1,2,3... gibi otomatik adlandırılırlar. Tabii bu durumda program yazarken "bu hangi butondu yaaaaaww!!!" dememek için uygulamayı çalıştırmadan önce anlaşılır, işlevine uygun isimler verirseniz çok rahat edersiniz. Örneğin benim yaptığım uygulamada Nöron ağları için HEBB öğrenme kuralını çalıştıracak bir butunum vardı ve ben bu butonun tag'ını " hebb " olarak kaydettim. Değiştirmeden çalıştırırsanız "pushbutton" gibi M.File'a butonun fonksiyonu yazılır, bu durumda .m file'dan o kod kısmını silip "tag"ı değiştirip tekrar çalıştırın. Elemanların diğer özelliklerini de biraz inceleyip bulabilirsiniz. Bu özelliklerden en önemli olanı " Callback " özelliğin ki bu ifade o elemanın yapacağı fonksiyonu işaret ediyor...

Elemanların yerleşimini bitirdikten sonra sıra geldi bu elemanları programlamaya... Hazırladığınız bu arayüzü kaydedip çalıştırdığınızda açılan .m file'a biraz göz atın ama gözünüzü korkutmayın...:))) Biraz karışık değil mi?? Şimdi ilk olarak " Tag "'ını değiştirdiğiniz elemanın fonksiyonunu arayın.. Benim uygulamamdaki buton için " function hebb_Callback(hObject, eventdata, handles) " olanı bulmamız gerekiyor. Bu fonksiyon o butona tıklandığında ne yapacağını ayarlayan fonksiyondur, yani butona her basışınızda bu fonksiyon çağrılır ve çalıştırılır. GUI'ya koyduğunuz tüm elemanların bu şekilde fonksiyonları bulunur.

Anlatıma benim yazdığım program üzerinden devam edelim... Bu program için hazırladığım arayüz aşağıda görülüyor..
Gördüğünüz gibi 7 buton ve bir sürü veri girişlerini okumak ve çıkışları yazdırmak için text alanlarımız var. Gerçi ben de bu anlattıklarımı 1 hafta içinde oturup öğrendiğim için bu konuda amatör sayılırım , hatam varsa affola...

Şimdi, yedi butondan biri "KAPAT" butonu, adından da anlaşılacağı gibi programı kapatıyor. Nasıl mı?? Bu butonun Property Inspector penceresindeki CALLBACK kısmına " closereq " yazın bakalım çalıştırıp tıkladığınızda ne olacak??? Property Inspector penceresinden ayarlanan tek CALLBACK özelliği bu butonda, diğerleri .m file'dan ayarlanacak..

Menü Oluşturma

Matlab'da kullanıcıya ayrı bir pencerede soru sormak ve vereceği cevabı öğrenmek için kullanılan menu aşağıdaki gibi oluşturulur.
akt_hebb=menu('HEBB Öğrenme Kuralı İçin Aktivasyon Fonksiyonu Seçiniz','Bipolar Sürekli','Bipolar Binary')
Bu kod ile aşağıdaki gibi kullanıcıya bir soru sorup bıtonlar ile kullanıcının şıklardan birini seçmesini sağlarız. Kullanıcı örneğin "Bipolar Sürekli" şıkkını seçerse "akt_hebb" değişkenine "1" atanır, diğeri seçilirse "2" atanır. Daha sonra "if" sorgusuyla bu değerin ne olduğu kontrol edilir.

Değişken Tanımlama

Matlab'da program içinde kullanacağımız değişkenleri aşağıdaki gibi tanımlayabiliriz. Bunları her fonksiyon içinde tanımlamak gerekli.
global W_1 X_1 X_2 X_3 X_4 X_5 X_6 d_1 d_2 d_3 d_4 d_5 d_6 adim_sayisi

Veri Giriş ekranı Oluşturma

prompt={'alfa', 'landa'}
defans={'', ''}
fields = {'alfa','landa'}
info = inputdlg(prompt, 'KATSAYILARI GİRİNİZ...!', 1, defans,'on')
if ~isempty(info) %see if user hit cancel
info = cell2struct(info,fields)
alfa = str2num(info.alfa)
landa = str2num(info.landa)
end
Bu kod ile aşağıda görülen ekran mesela bir butona basıldığında açılır. Burada "promt" içinde yazılanlar kutuların adını, "defans" ile belirtilen defaul cevapları ki ben bunları boşluk olarak aldım, "fields" ile gösterilenler de bu kutulara girilen verilerin atanacağı değişkenleri gösteriyor.
if döngüsünde de veri girişinin yapılıp yapılmadığı ve yapıldıysa değişkenlere atama işlemleri yapılıyor. Yani HEBB butonuna basıldığında yapılacak işlemlerin fonksiyonu şu hale gelmiş olmalı...
% --- Executes on button press in hebb.
function hebb_Callback(hObject, eventdata, handles)
% hObject handle to hebb (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global W_1 X_1 X_2 X_3 X_4 X_5 X_6 d_1 d_2 d_3 d_4 d_5 d_6 adim_sayisi %değişkenleri tanıtıyoruz
akt_hebb=menu('HEBB Öğrenme Kuralı İçin Aktivasyon Fonksiyonu Seçiniz','Bipolar Sürekli','Bipolar Binary')
% katsayıları soruyoruz
prompt={'alfa', 'landa'}
defans={'', ''}
fields = {'alfa','landa'}
info = inputdlg(prompt, 'KATSAYILARI GİRİNİZ...!', 1, defans,'on')
if ~isempty(info) %see if user hit cancel
info = cell2struct(info,fields)
alfa = str2num(info.alfa)
landa = str2num(info.landa)
%msgbox([myname ', I hope ' mycall ' was what you wanted.'], 'Cool!')
end

Edit Text Kutularından Veri Girişi Yapılması

Program arayüzünde görülen "Adım Sayısı" girişine girilecek olan sayısı bir değişkene şu şekilde atama yapıyoruz.
adim_sayisi=str2double(get(handles.adim,'String'))
"handles.adim" da geçen "adim" ifadesi benim o text kutusuna verdiğim TAG ismi. Sanırım şimdi TAG'lara neden bu şekilde isimler verilmesi gerektiğini anlamışsınızdır...:)) Bu kod ile adı geçen text kutusuna girilen sayı GET ile alınıp "adim_sayisi" değişkenine atanıyor.
W_1=num2str(get(handles.W1,'String')) %girilen X'leri okur
myfunc=['W_1=' W_1];
eval(myfunc)
Bu ifadeyi de biraz ilginç, ben bu şekilde oluşturdum, belki daha kolay bi yolu vardır. Benim yapmak istediğim şey arayüzdeki W1, X1... alanlarından 1 sutun-birkaç satır şeklinde matris bilgisi almak. Burada aynı şekilde girilen ifade bu sefer number olarak alınıp num2str ile string hale getiriliyor. Ardından myfunc=['W_1=' W_1]; ile [] içindeki " ' W_1= 'W_1 " oluşturuluyor. Şimdi bu da ne demek???? Son satırdaki eval(myfunc) ile bu [] içindeki yazı aynen matlab'ın komut satırına >>W_1= W_1 şeklinde yazılmış gibi işlem yapıyor veee W_1 değişkenime TAG ismi W1 olan kutudan girdiğim matris ifadesini atıyor. Bu durumda matlab'da işlenen komutların sonuçlarına bakarsanız ne demek istediğimi anlarsınız. Peki bu işi neden "Adım Sayısı" gibi tek satırda olmadı derseniz nedeni işte bu matris okuma işlemi... Biraz karışık ama ben daha kolayını bulamadım :(

Edit Text Kutularına Veri Çıkışı Yapılması

Arayüzde görülen 1. Adım, 2.Adım bölümündeki kutulara da hesaplanan matrisleri girmek gerekiyor. Bunu da aşağıdaki şekilde yaptım.
set(handles.W2,'String',['[' num2str(W_2') ']t']);
Bu komut TAG'ı W2 olan 1. Adım altındaki kutuya işlemler sonunda hesaplanan W_2 matrisinin transpozunu bularak elde ettiği number cinsinden değeri num2str ile string türü ifadeye çevirip başına ve sonuna matrisin transpozu olduğu belli olsun diye '[' ve ']t' işaretlerini ekliyor.. "t" transpozu simgeliyor.. Neden matlabın kendisindeki gibi ' işareti almadık? Çünkü bu ekstra ifadeleri ' ile ekliyoruz zaten bir de transpoz için almamıza izin vermiyor.