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 pence11.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
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
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)
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.