Upload
phamkiet
View
326
Download
1
Embed Size (px)
Citation preview
ALGORİTMA VE
PROGRAMLAMA
Ek Ders Notu
Algoritma ve Programlama 2 04.01.2013
MATLAB’de Programlama
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ı
Matlab’de programlama en genel olarak iki yolla yapılır:
Algoritma ve Programlama 3 04.01.2013
Ö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);
KOMUT PENCERESİ
>>uzaklik
Düzyazı (script) m-dosyaları daha önceki derslerde anlatılmıştır. Aşağıda
bir m-dosyası örneği verilmiştir.
Algoritma ve Programlama 4 04.01.2013
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 5 04.01.2013
Fonksiyon m-dosyaları
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
m = n;
end
y = sum(x)/m;
Output Arguments Input Arguments Function Name
Online Help
Function Code
Algoritma ve Programlama 6 04.01.2013
Ö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 7 04.01.2013
Ö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.)
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
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
Algoritma ve Programlama 8 04.01.2013
Ö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 9 04.01.2013
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 10 04.01.2013
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 11 04.01.2013
Veri
Mantıksal Karakter Sayısal Hücresel Yapısal
int8, uint8
int16, uint16
int32, uint32
int64, uint64
single double
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.
Algoritma ve Programlama 12 04.01.2013
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 13 04.01.2013
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 14 04.01.2013
Ç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 15 04.01.2013
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 16 04.01.2013
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 17 04.01.2013
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 18 04.01.2013
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 19 04.01.2013
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 20 04.01.2013
MATLAB/Diziler (Hücre Dizileri) C=cell(n) nn 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 21 04.01.2013
MATLAB/Diziler (Hücre Dizileri)
C{1,1}
C{2,1}
C{3,1}
C{1,2}
C{2,2}
C{3,2}
C=cell(3,2) hücresi
C{1,2}{1,1} C{1,2}{1,2}
C{1,2}{2,1} C{1,2}{2,2}
C{1,2} hücresi
C{1,2}{2,2} hücresi
Yeni alt
hücre(ler)
Algoritma ve Programlama 22 04.01.2013
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.univ='YTU';
A.city='Istanbul';
A.email=‘[email protected]';
A.year=2012;
ile A, bir structure array olur.
>>A
A =
name: ‘Bahattin'
sname: ‘Erdogan'
univ: 'YTU'
city: 'Istanbul'
email:
year: 2012
A yapı dizisi çağrıldığında,
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 23 04.01.2013
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 24 04.01.2013
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 25 04.01.2013
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
Dönüşüm (Biçim) Kodları
Algoritma ve Programlama 26 04.01.2013
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 27 04.01.2013
Ö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 28 04.01.2013
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 29 04.01.2013
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ı Açıklama
‘r’ Sadece okuma için varolan bir dosyayı açar.
‘rt’ Okuma ve yazma için varolan bir dosyayı açar.
‘w’ Yazma modunda dosya açar; dosya yoksa oluşturulur ve daha
önce böyle bir dosya varsa ondaki bilgiler yitirilir.
‘wt’ Varolan bir dosyanın içindekilerini siler ve okuma ve yazma işlemi
için açar
‘a’ Varolan bir dosyayı yalnızca yazma işlemi için açar ve yeni
yazılanları dosyanın sonuna ekler.
‘a+’ 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 30 04.01.2013
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 31 04.01.2013
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 32 04.01.2013
num = xlsread(‘filename’, sheet,
'range')
Excel’ den veri okutmak amacıyla xlsread fonksiyonu kullanılır.
A = xlsread('deneme.xlsx', 1,
'C4:D7')
A =
1 6
2 7
3 8
4 9
Algoritma ve Programlama 33 04.01.2013
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 34 04.01.2013
MATLAB/ Derleyici (Compiler)
34
Klavyeden girilen iki sayının toplamını hesaplayan programın derlenerek .exe file haline getirilmesi
>>mcc –m toplama (komut satırına yazılarak exe dosyası oluşturulur)
%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)
Algoritma ve Programlama 35 04.01.2013
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 36 04.01.2013
MATLAB/ Derleyici (deploytool)
build - .exe file oluşturulmasını
sağlar.
Algoritma ve Programlama 37 04.01.2013
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.