ALGORİTMA VE PROGRAMLAMA Ek Ders Notu
MATLAB de Programlama Matlab de programlama en genel olarak iki yolla yapılır: 1. Komut satırında (in-line) programlama 2. m-dosyaları yla (m-files) programlama m-dosyalarının da iki türü vardır: 1. Düzyazı (script) m-dosyaları 2. Fonksiyon (function) m-dosyaları Algoritma ve Programlama 2
Düzyazı (script) m-dosyaları daha önceki derslerde anlatılmıştır. Aşağıda bir m-dosyası örneği verilmiştir. Örnek: İki nokta arasındaki uzaklığı bulan programın m-dosyası ile çözümü uzaklik.m clc;clear; x1=input(' x1 koordinatini gir '); y1=input(' y1 koordinatini gir '); x2=input(' x2 koordinatini gir '); y2=input(' y2 koordinatini gir '); mesafe=sqrt((x2-x1)^2+(y2-y1)^2); fprintf(' Girilen 2 nokta arasi mesafe : %f \n ',mesafe); >>uzaklik KOMUT PENCERESİ Algoritma ve Programlama 3
Fonksiyon m-dosyaları Fonksiyon, belirli sayıda verileri kullanarak bunları işleyen ve bir sonuç üreten yapıdır. Fonksiyon m-dosyaları düzyazı m-dosyalarına benzerler. Ancak iki temel farkı vardır. 1. Fonksiyonlar bir değeri ve değerler kümesini döndürür. 2. Fonksiyonların içinde atanmış değişkenler, fonksiyona ait yerel değişkenlerdir (local variables) ve MATLAB komut penceresinde gösterilmezler. Bu değişkenler komut satırından da geri çağırılamazlar. Oysa script lerde değişkenler genel (global variables) olup MATLAB komut penceresinde gösterilir ve komut satırından çağırılabilirler. Fonksiyonların genel yazım biçimi; function degisken_adi=fonksiyon_adi (giris degiskeni) Veya function [out1,out2,...,outn] = fonksiyon_adı (in1,in2,...,inm) Algoritma ve Programlama 4
Fonksiyon m-dosyaları Output Arguments Function Name Input Arguments Online Help Function Code function y = ortalama (x) % Ortalama Average or mean value. % For vectors, ortalama(x) returns the mean value. % For matrices, ortalama(x) is a row vector % containing the mean value of each column. [m,n] = size(x); if m == 1 end m = n; y = sum(x)/m; Algoritma ve Programlama 5
Örnek: İki nokta arasındaki uzaklığı bulan programı m-fonksiyon kullanarak yazınız. x1 = 1.noktanın x koordinati; x2 = 2.noktanın x koordinati y1 = 1.noktanın y koordinati; y2 = 2.noktanın y koordinati function mesafe = uzaklik(x1,y1,x2,y2) %imza mesafe=sqrt((x2-x1)^2+(y2-y1)^2); %tanım Bu M fonksiyonu uzaklik.m olarak kaydedilir. KOMUT PENCERESİ >> sonuc = uzaklik(3,4,1,2) % ya da >> uzaklik(3,4,1,2) % sonuc ans adli degiskene atanir Algoritma ve Programlama 6
Örnek: Girilen iki sayının harmonik ortalamasını bulan fonksiyon m-dosyasını yazınız. function h=horta(a,b) %horta:harmonik Ortalama % horta(a,b) verilen iki sayının harmonik ortalamasını hesaplar h=2/(1/a+1/b) Örnek: Aşağıdaki gibi bir ekran çıktısı verecek ekranarakambas.m adında bir fonksiyon M dosyası yazınız. (Fonksiyonunuz kendisine hiçbir argüman almayacak ve geriye yine hiçbir değer çevirmeyecektir.) EKRAN ÇIKTISI >>ekranarakambas() 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 1 2 3 4 5 6 1 2 3 4 5 1 2 3 4 1 2 3 1 2 1 ekranarakambas.m function ekranarakambas() clc; for i=1:9 %satir sayisi for j=1:(10-i) %sutun sayisi fprintf('%d ',j); end fprintf('\n'); end Algoritma ve Programlama 7
Örnek: Girilen bir sayı vektörünün ortalama değerini ve standart sapmasını bulan bir fonksiyon yazalım. function [ort, stds] = ort_stdsapma (x) % ort_stdsapma fonksiyonu girilen matristeki her bir sütunun ortalama değerini %ve standart sapmasını bulur. [m,n] = size(x); if m == 1 m = n; end ort = sum(x)/m; stds=sqrt(sum(x.^2)/m-ort.^2); MATLAB komut satırında aşağıdaki satırlar sırasıyla yazılırsa; >> a=[1 2 3 4 5]; >> [x,y]=ort_stdsapma(a) x = 3 y = 1.4142 Algoritma ve Programlama 8
Fonksiyon m-dosyasında önemli noktalar: 1. Fonksiyon m-dosyalarında ilk satır kesinlikle function ile başlamalıdır. Bu ilk satır fonksiyon tanımının yapıldığı satır olup fonksiyon adı ve giriş çıkış değişkenleri bu satırda belirtilir. 2. Fonksiyon hakkında yardım istenildiğinde, yani help fonksiyon_adi yazıldığında görüntülenecek % ile başlayan açıklama satırları ilk satırdan hemen sonra yazılmalıdır. 3. Fonksiyon adı ile dosya adı aynı olmalıdır. 4. Değişken çıkışları ekrana yazdırılmamalıdır. 5. Bir fonksiyon içerisinde kullanılan bütün değişkenler bu fonksiyon için geçerlidir. 6. Eğer değişkenleri fonksiyon dışında da geçerli kılmak isteniyorsa global komutu kullanılabilir. Algoritma ve Programlama 9
Uygulama: Daha önceki derslerde gösterilen bir polinomun türevini alan polyder(p) fonksiyonunun polinomturev adı ile fonksiyon m-dosyası olarak yazılması. >>P=[-7-3 1 14] >>polyder(p) ans -21-6 1 Algoritma ve Programlama 10
MATLAB de Veri Türleri MATLAB de 15 temel veri türü vardır. Bunların herbiri dizi formatındadır. MATLAB ile yapılan işlem ve hesaplamalarda genellikle çift duyarlıklı (double) ve karakter (char) veri türleri kullanılır. MATLAB de yerleşik fonksiyonların hemen hemen tamamı double ve char veri türleriyle işleme konur. Veri Mantıksal Karakter Sayısal Hücresel Yapısal int8, uint8 int16, uint16 int32, uint32 int64, uint64 single double Algoritma ve Programlama 11
MATLAB de Veri Türleri Mantıksal: 1 ve 0 sayılarını kullanarak doğru ve yanlış değerleri gösterir. MATLAB, mantıksal işlemler ve fonksiyonlardan ilgili mantıksal değeri döndürür. char: Karakterleri tutar. Dizideki her katar aynı uzunlukta olduğu sürece mxn boyunda katar dizisini temsil etmek için char kullanılır. Eşit uzunlukta olmayan katarı temsil etmek için cell array (hücre dizi) kullanılır. Sayısal (numeric): işaretli (int) veya işaretsiz (uint) tamsayılar, tek (single) ve çift (double) duyarlıklı kayan noktalı sayılardan oluşur. MATLAB de tüm hesap işlemleri double veri türü ile yapılır. Tamsayı veya single diziler üzerinde matematiksel işlemleri yapmak için, bunlar fonksiyon kullanılarak double veri türüne dönüştürülmelidir. Tamsayı veya single türü diziler, double dizilerden daha fazla bellek yeri kullanırlar. Hücre dizi (cell array): Farklı tür ve boydaki diziler, bir hücre dizi içindeki hücrelerde saklanabilir. Yapı (structure): Benzer olmayan veri türlerini saklayan hücre diziye benzer. Ancak bu durumda veriler, hücrelerde değil de adlandırılmış alanlarda (named field) saklanır. Algoritma ve Programlama 12
Karakter Katarı (String) İşlemleri Karakterler katarı veya yalnızca katar/sözcük (string), iki tek tırnak arasındaki ifade edilen, gerçekte ASCII kod tablosunda sayısal kodlarla belirtilen ilk 127 karakterden oluşan karakter dizileridir (char array). Katar uzunluğu, katardaki karakter sayısıdır. Her bir karakter bellekte 1 byte (8 bit) yer kaplar. >> ders='algoritmalar' ders = algoritmalar Burada verilen ders değişkeninde her bir harf ASCII kod tablosundaki sayısal bir koda sahiptir. >> kod=double(ders) kod = 97 108 103 111 114 105 116 109 97 108 97 114 Tam tersi olarak ASCII karşılığı verilen bir katarın karakter karşılığını bulmak için char fonksiyonu kullanılır. >> char(kod) ans = algoritmalar Algoritma ve Programlama 13
Çok Boyutlu Katar Gösterimleri >> x='10014'; >> a=[ders,' ders kodu:', x] a = algoritmalar ders kodu:10014 Katarların Karşılaştırılması strcmp: İki katarın aynı olup olmadığını belirler. strcmpi: iki katarın harf durumu dikkate alınmadan aynı olup olmadığını belirler. strncmp: iki katarın ilk n karakterinin aynı olup olmadığını belirler. strncmpi: ilk katarın harf durumu dikkate alınmadan ilk n karakterinin aynı olup olmadığını belirler. Algoritma ve Programlama 14
Katarların Tek Tek Karşılaştırılması Katar dizileri aynı boyutlu veya en az biri skaler olmak koşuluyla karakter eşitlik karşılaştırılması için ilişkisel operatörler (>, >=,<, <=, ==, ~=) kullanılabilir. >> x='matlab'; >> y='matema'; >> x==y ans = 1 1 1 0 0 0 Büyük-Küçük Harf Dönüşümleri upper: Katardaki tüm harfleri büyük harfe dönüştürür. lower: Katardaki tüm harfleri küçük harfe dönüştürür. Algoritma ve Programlama 15
Sayı-Katar Dönüşümü num2str: Kayan noktalı sayıyı (tamsayı yada ondalıklı) katara dönüştürür. int2str: Yalnızca bir tamsayıyı katara dönüştürür. >> a=236; >> akatar=num2str(a) akatar = 236 >> double(akatar) ans = 50 51 54 Algoritma ve Programlama 16
Katar-Sayı Dönüşümleri str2num: ASCII katarı sayıya dönüştürür. eval: Sayısal biçimden sayı içeren katara dönüştürür. >> z='123'; >> x=str2num(z) x = 123 >> 123*2 ans = 246 >> d='234'; >> eval(d) ans = 234 >> katar='k=1:5' katar = k=1:5 >> eval(katar) k = 1 2 3 4 5 Algoritma ve Programlama 17
Katarlar ile ilgili örnek: Bir metin içinde kaç tane a harfi olduğunu bulan programın yazılması. clear all; a='there is no function or block with this name.you may want to Check that you have spelled the name correctly.'; s=0; for i=1:1:length(a) if a(i)=='a' s=s+1; end end s Çalışma Sorusu: Rakamlarla yazılan bir sayının söylenildiği gibi ekrana basılmasını sağlayan programın yazılması. (1234 Bin iki yüz otuz dört) Algoritma ve Programlama 18
MATLAB/Diziler (Hücre Dizileri) Hücre Dizileri (Cell arrays) { } ile tanımlanır. Böylesi bir dizi, farklı matrisleri aynı isim altında tutmak ve işlemek için kullanılmaktadır. Örneğin, C{1}=[1 2;3 5],C{2}=[4 4 4 4];C{3}=[('yildiz teknik'),(' elektronik')]; girildiğinde, C bir hücre dizisi olur. Bu hücre geri çağrıldığında, C = [2x2 double] [1x4 double] [1x20 char] C{1} hücresi C{2} hücresi C{3} hücresi Her bir hücre ayrı ayrı işlenir. Algoritma ve Programlama 19
MATLAB/Diziler (Hücre Dizileri) C=cell(n) n n hücreden oluşan boş bir hücreyi C ye atar. Örneğin n=2 için >> C=cell(2) C = [] [] [] [] hücresi oluşturulur. Bir hücrenin içine istenilen sayıda yeni hücreler eklemek mümkündür; Örneğin, C{1}{1}=[2 3] ile C aşağıdaki biçimde değişir; C = {1x1 cell} [] [] [] Algoritma ve Programlama 20
MATLAB/Diziler (Hücre Dizileri) C=cell(3,2) hücresi C{1,2} hücresi C{1,1} C{1,2} C{1,2}{1,1} C{1,2}{1,2} C{2,1} C{2,2} C{1,2}{2,1} C{1,2}{2,2} C{3,1} C{3,2} Yeni alt hücre(ler) C{1,2}{2,2} hücresi Algoritma ve Programlama 21
MATLAB/Diziler (Yapı Dizileri) Yapı dizileri (Structure arrays), veri tabanları için oldukça kullanılışlı bir dizi türüdür. A.name= Bahattin'; A.sname= Erdogan'; >>A A yapı dizisi çağrıldığında, A.univ='YTU'; A = A.city='Istanbul'; name: Bahattin' A.email= berdogan@yildiz.edu.tr'; sname: Erdogan' A.year=2012; univ: 'YTU' city: 'Istanbul' email: ile A, bir structure array olur. berdogan@yildiz.edu.tr' year: 2012 Hücre ve yapı dizileri, mat uzantılı dosyalar olarak, daha önce açıklanan save komutuyla kaydedilip, load komutuyla geri çağrılabilir. Algoritma ve Programlama 22
Program Çıkışı ve Sonuç Gösterme İşlemleri disp fonksiyonu: disp(x) şeklindedir. Bir dizi veya metni görüntüler. Dizinin değişken adı ekrana yazılmaz. X bir karakter katarı ise metin olarak görüntülenir. disp(' ') disp(' A-Deg B-Deg C-Deg') disp(' ===== ===== =====') disp(rand(4,3)) Ekranda görülen; A-Deg B-Deg C-Deg ===== ===== ===== 0.1389 0.2722 0.4451 0.2028 0.1988 0.9318 0.1987 0.0153 0.4660 0.6038 0.7468 0.4186 Algoritma ve Programlama 23
fprintf fonksiyonu: Çıkışın formatlı yaptırılmak ve bunun bir disk dosyasına yazdırılması istendiğinde kullanılır. Genel yazım biçimi; kont=fprintf(fid, format, A, ) Bu fonksiyon A matrisinin reel kısmındaki verileri, format parametresiyle belirtilen kurala göre düzenler ve fid ile belirtilen dosyaya yazar ve kapsadığı byte sayısını kont değişkenine atar. Ancak burada şimdilik ekrana yazdırma işlemi ile ilgileneceğimiz için; fprintf( format, A, ) Daha basit bir gösterimle; fprintf(format_katarı, dönüşüm_karakterleri) Algoritma ve Programlama 24
Dönüşüm (Biçim) Kodları Belirteç Tanımı %e Küçük harf ile bilimsel notasyon %E Büyük harf ile bilimsel notasyon %f Sabit nokta (ondalık) notasyon %g En kısa olmasına göre %e veya %f %G %g ile aynı ancak E kullanılır %s Karakter katarı tanımlar %c Tekil karakter %d İşaretli ondalık notasyon %u İşaretsiz ondalık notasyon Algoritma ve Programlama 25
Tamsayı verisi, %d format dönüşüm belirleyicisi ile gösterilir. >> x=123; >> fprintf('islem sonucu %d bulunmustur. \n', x) Islem sonucu 123 bulunmustur. Kayan noktalı, yani ondalık sayı verisi, %f veya %e veya %g format dönüşüm belirleyicisi ile gösterilir. >> x=1.23; >> fprintf('islem sonucu %6f bulunmustur. \n', x) Islem sonucu 1.230000 bulunmustur. >> fprintf('islem sonucu %6.2f bulunmustur. \n', x) Islem sonucu 1.23 bulunmustur. >> fprintf('islem sonucu %4.2f bulunmustur. \n', x) Islem sonucu 1.23 bulunmustur. >> fprintf('islem sonucu %4.2e bulunmustur. \n', x) Islem sonucu 1.23e+000 bulunmustur. Algoritma ve Programlama 26
Örnek: clear all; for i=1:2 for j=1:2 fprintf('a matrisinin %d,%d.ci elemanini giriniz:',i,j) A(i,j)=input(''); end end A MATLAB ekran çıktısı aşağıda verilmiştir. A matrisinin 1,1.ci elemanini giriniz:1 A matrisinin 1,2.ci elemanini giriniz:2 A matrisinin 2,1.ci elemanini giriniz:3 A matrisinin 2,2.ci elemanini giriniz:4 A = 1 2 3 4 Algoritma ve Programlama 27
Giriş/Çıkış Fonksiyonları textread: Bu fonksiyon ASCII dosyaları okumak için kullanılır. Genel yazım biçimi; [a, b, c, ]=textread( dosyaadi, format, N) dosyaadi açılmak istenen dosyanın ismidir. format, herbir sütundaki verinin açıklamasını içeren bir katardır. N ise okunacak satır sayısıdır. N belirtilmemişse dosya sonuna kadar okunur. Aşağıda verilen isciverileri.txt dosyasından veri okunmak istenirse; >> [Adi, Soyadi, Yasi, Maasi, Vergiorani]=textread('isciverileri.txt', '%s %s %f %f %f') Algoritma ve Programlama 28
fopen: Bu fonksiyon daha önce oluşturulmuş dosyaları açmak için kullanılır. Genel yazım biçimi; ifade=fopen( dosyaadi, izin ) dosyaadi açılmak istenen dosyanın ismidir. izin ise erişim modunu belirten bir katardır. İzin Formatı r rt w wt a a+ Açıklama Sadece okuma için varolan bir dosyayı açar. Okuma ve yazma için varolan bir dosyayı açar. Yazma modunda dosya açar; dosya yoksa oluşturulur ve daha önce böyle bir dosya varsa ondaki bilgiler yitirilir. Varolan bir dosyanın içindekilerini siler ve okuma ve yazma işlemi için açar Varolan bir dosyayı yalnızca yazma işlemi için açar ve yeni yazılanları dosyanın sonuna ekler. Varolan bir dosyayı, okuma ve yazma işlemi için açar ve yeni verileri dosyanın sonuna ekler. fclose: Bu fonksiyon daha önce oluşturulmuş dosyaları kapamak için kullanılır. Genel yazım biçimi; fclose(ifade) Algoritma ve Programlama 29
Veri Dosyası Oluşturma ve Çağırma Örnek: Tbasla=input('Ilk sıcaklık degerinin yaziniz:'); Tson=input('Son sıcaklık degerinin yaziniz:'); ntemp=input('kac deger istediginizi giriniz:'); santigrat=linspace(tbasla,tson,ntemp); fahrenhayt=1.8*santigrat+32; fid=fopen('temp.txt','wt'); fprintf(fid,'sicaklik donusum tablosu\n'); fprintf(fid,'--------------------------\n'); fprintf(fid,' santigrat fahrenhayt\n'); for k=1:ntemp fprintf(fid, '%f %f \n', santigrat(k), fahrenhayt(k) ); end fclose(fid); Algoritma ve Programlama 30
MATLAB-EXCEL Veri Transferi Dış Ortam Veri İşlemi Bir Excel (.xls) veri dosyası veya.txt ya da.dat dosyası Matlab ortamından okunabilir ve üzerinde Matlab işlemleri uygulanabilir. Benzer olarak bir Matlab program çıkışı da.xls olarak kaydedilebilir. - Excel: degisken =xlsread( xxx.xls ) - x=degisken(:,1); %1. sütun - y=degisken(:,2); %2. sütun -.txt veya.dat : load xxx.txt - x=xxx(:,1); %1. sütun - y=xxx(:,2); %2. sütun Algoritma ve Programlama 31
Excel den veri okutmak amacıyla xlsread fonksiyonu kullanılır. num = xlsread( filename, sheet, 'range') A = xlsread('deneme.xlsx', 1, 'C4:D7') A = 1 6 2 7 3 8 4 9 Algoritma ve Programlama 32
MATLAB/ Derleyici (Compiler) C, Pascal, Basic gibi yüksek veya orta düzey dillerde yazılan bir programın çalışabilmesi için önce makine diline çevrilmesi gerekir; bu işleme derleme (compilation) denir. Derleme işini yapan programlar da derleyici (compiler) olarak adlandırılır. MATLAB de sadece m-fonksiyon veya grafik kullanıcı arayüzü (GUI) şeklindeki programlar derlenebilmektedir. MATLAB derleyicisi (mcc) ile MATLAB de oluşturulan m-fonksiyon dosyaları C/C++ dosyalarına,.c dosyalar da MATLAB formatına dönüştürülebilir. >> mcc m dosya_adi yazımı ile dosya_adi.m adlı dosya kendi başına çalışabilen dosya_adi.exe haline ve C koduna dönüştürülür. >> mcc p dosya_adi yazımı ile dosya_adi.m adlı dosya kendi başına çalışabilen dosya_adi.exe haline ve C++ koduna dönüştürülür. Algoritma ve Programlama 33
MATLAB/ Derleyici (Compiler) Klavyeden girilen iki sayının toplamını hesaplayan programın derlenerek.exe file haline getirilmesi %iki sayinin toplamini hesaplayan program a=input('birinci sayiyi giriniz= '); b=input('ikinci sayiyi giriniz= '); c=a+b; fprintf('%f ve %f in toplami %f dir',a,b,c) >>mcc m toplama (komut satırına yazılarak exe dosyası oluşturulur) Algoritma ve Programlama 34 34
MATLAB/ Derleyici (deploytool) Oluşturulan.exe dosyasının MATLAB kurulu olmayan bir bilgisayarda çalışabilmesi için MATLAB Compiler Runtime (MCR) programının kurulması gerekir. MCR farklı MATLAB versiyonları için değişiklik gösterir. exe dosyası hangi MATLAB versiyonunda derlendiyse ilgili MCR bilgisayarda kurulmalıdır. Kullanıcıya.exe uzantılı dosyanın çalışabilmesi için gerekli tüm dosyaların verilmesi gerekir. Bu amaçla deploytool fonksiyonu kullanılabilir. Algoritma ve Programlama 35
MATLAB/ Derleyici (deploytool) build -.exe file oluşturulmasını sağlar. Algoritma ve Programlama 36
MATLAB/ Derleyici (deploytool) Package Matlab kurulu olmayan bilgisayarda, exe uzantılı dosyanın çalıştırılabilmesi için bir paket program hazırlar. Sonuç olarak.pkg.exe uzantılı bir dosya oluşturulur. Bu dosya çalıştırıldığında bilgisayarda MATLAB de derlenen.exe uzantılı programın çalıştırılabilmesi için gerekli programı kurar. Algoritma ve Programlama 37