Professional Documents
Culture Documents
Matla Bile Program La Maya Giris
Matla Bile Program La Maya Giris
v 0.1
İsmail Arı
1 Nisan 2008
1
Matlab Programlamaya Giriş
Görüntü işleme kodlarını anlamak için öncelikle MATLAB bilmek gerekiyor. Bi-
raz baktım da, internette derli toplu Türkçe bir MATLAB programlama kaynağı
yok. Daha doğrusu olanlar o kadar yavaş ilerliyor ki... Programlama bilip de
hızlıca MATLAB öğrenmek isteyenlere pek uygun gözükmüyor. Güzel bir kay-
nak olduğunu düşündüğüm kodları açıklamalarıyla birlikte göndereyim istedim.
Şimdilik yüzeysel bir ders (’tutorial’) oldu.. Biraz (!) zamanımı alıyor
açıkçası. Eklemeler olursa sonraki yazı(lar)da genişletirim. Daha sonra da ra-
hatça görüntü işleme çalışmalarına başlayabileceğim.
İçindekiler
• Başlamadan
• MATLAB’de Temel Veri Yapıları
• Vektör ve Matrisler Üzerinde Basit İşlemler
• Kontrol İşlemleri ve Vektörleme (Vectorization)
• Değişkenleri/Oturumu Kaydetmek
• m-dosyaları ile Betikler ve Fonksiyonlar Yazma:
• Grafik Çizdirme
• Karmaşık Sayılarla İşlemler
Başlamadan
”%” sembolü yorumlar icin kullanılır (satır sonuna kadar) ipucu: Birden fazla
satir icin hataAyiklama diye global bir değişken tanımlayıp
if hataAyiklama
islemler
end
şeklinde yazabilirsiniz
Tek satırda kullanmak için oldukça uzun olan bir işlem yazacağınız zaman alt
satıra geçtiğinizi belirtmek amacıyla satır sonuna ... ekleyin. Ör:
A = [1, 2; ...
3, 4];
2
İşlem sonuna noktalı virgül konulursa MATLAB sonucu ekrana basmaz. Eğer
”;” eklemezseniz sonuç görüntülenir. Değişkenlerin değerlerini görmek için fay-
dalıdır. Ör:
clear
clc
MATLAB komut satırı komut sistemine (kabuk) benzetilebilir:
Basit hata ayiklama: Eğer ”dbstop if error” çalişma sırasında hata veren
bir betiği/fonksiyonu çalıştırmadan önce yazılmışsa, program hatanın olduğu
yerde durur. Hata ayıklamak icin çok işe yarayabilir. Ama bana kalırsa en
temizi ”breakpoint” koyarak hata ayıklamaktır. Program o noktaya geldiğinde
istediğiniz değişkeni gözlemleyebilirsiniz.
Not: Aslinda bunlarin hepsi birer matristir. Örneğin skalar bir sayı 1x1lik
bir matrisdir.
3
2x2lik matrisler yaratalım. Matris yaratmanın en basit yolu elemanlarını kare
parantez içinde yazmaktır. ; sembolu satırları, (isteğe bağlı) , ise sütunlari
ayırır.
A = [1 2; 3 4];
B = [1,2; 3,4];
Görüldüğü üzere noktalı virgülle bitirdiğimiz için sonuçlar ekrana basılmadı.
Şimdi skalar bir değer oluşturalım.
N = 5
N =
v = [1 0 0]
v = [1; 2; 3]
v =
1 0 0
v =
1
2
3
4
v = v.’
v =
1 2 3
Vektör değerlerini teker teker yazmak zor sanki böyle. Gelin ko-
layına kaçıp belli aralıklar ile doldurulmus vektör oluşturalım. Kullanım:
[baslangic:adım:bitis]
v = 1:.5:3
v = pi*[-4:2:4]/4 % (kare parantezler istege bağlı)
v =
v =
v = linspace(1,3,5)
v =
v = []
v =
[]
5
(B) Özel matrisler oluşturma:
m = zeros(2, 3)
v = ones(2, 3)
m =
0 0 0
0 0 0
v =
1 1 1
1 1 1
m = eye(3)
m =
1 0 0
0 1 0
0 0 1
v = rand(3, 1)
v =
0.1084
0.9835
0.2483
6
Dikkat: Eğer iki değil de bir parametre verirsek, örneğin 3x3luk sıfır matrisi
oluşturur (vektör değil!)
m = zeros(3)
m =
0 0 0
0 0 0
0 0 0
v = [1 2 3];
v(3)
ans =
v(2) = []
v =
1 3
Matris bir tane elemanına ulaşmak için matris(SATIR No, SUTUN No)
m = [1 2 3 4; 5 7 8 8; 9 10 11 12; 13 14 15 16]
m(1, 3)
m =
1 2 3 4
7
5 7 8 8
9 10 11 12
13 14 15 16
ans =
Matrisin tüm satırına ulaşma (2. satır) ve tüm sütununa ulaşma (1. sütun)
m(2, :)
m(:, 1)
ans =
5 7 8 8
ans =
1
5
9
13
m(1, 1:3)
ans =
1 2 3
m(2:3, 2)
ans =
7
10
8
Anahtar sözcük end satır/sütun’daki son elemana kadar demektir
m(2:end, 3)
ans =
8
11
15
m = [1 2 3; 4 5 6]
size(m)
m =
1 2 3
4 5 6
ans =
2 3
Satır sayısı
size(m, 1)
ans =
Sütun sayısı
size(m, 2)
ans =
9
m ile aynı boyutta yeni bir matris oluşturmak istersek
m1 = zeros(size(m))
m1 =
0 0 0
0 0 0
Şu ana kadar bir hayli çalıştık. Çalışma alanindaki değişkenleri görelim
who
A B N ans m m1 v
whos
A 2x2 32 double
B 2x2 32 double
N 1x1 8 double
ans 1x1 8 double
m 2x3 48 double
m1 2x3 48 double
v 1x2 16 double
10
Sütun vektörünü skalar ile çarpma ve skalara bölme
a = [1 2 3 4]’;
2 * a
ans =
2
4
6
8
a / 4
ans =
0.2500
0.5000
0.7500
1.0000
b = [5 6 7 8]’;
a + b
ans =
6
8
10
12
a - b
ans =
-4
-4
-4
-4
11
Eleman eleman kare alma, çarpma ve bölme. .’ya dikkat edin! Normal sem-
boller matris çarpma ve bölmesi demek!
a .^ 2
ans =
1
4
9
16
a .* b
ans =
5
12
21
32
a ./ b
ans =
0.2000
0.3333
0.4286
0.5000
log([1 2 3 4])
ans =
12
round([1.5 2; 2.2 3.1])
ans =
2 2
2 3
Benzer sekilde eleman eleman işlem yapabilen birçok fonksiyon vardır. Ör: :
floor, ceil, ...
(B) Vektör işlemleri Vektörlerde işlem yapan önceden tanımlı bazı MAT-
LAB fonksiyonları
a = [1 4 6 3]
a =
1 4 6 3
sum(a)
ans =
14
mean(a)
ans =
3.5000
13
Vektör elemanlarının değişintisi (varyans)
var(a)
ans =
4.3333
Standart sapma
std(a)
ans =
2.0817
max(a)
ans =
min(a)
ans =
a = [1 2 3; 4 5 6]
a =
1 2 3
4 5 6
14
Her sütunun ortalaması
mean(a)
ans =
max(a)
ans =
4 5 6
max(max(a))
ans =
mean(a, 2)
ans =
2
5
Vektörlerde çarpma ve bölme işlemlerine geçelim. 1x3 satır vektörü ile 3x1
sütun vektörü çarpımı sonucu skalar elde ederiz. Nokta çarpımı veya iç çarpım
olarak da bilinir. . kullanmadığımıza dikkat edin.
[1 2 3] * [4 5 6]’
15
ans =
32
3x1 sütun vektörü ile 1x3 satır vektörü çarpımı 3x3lük matris oluşturur.
[1 2 3]’ * [4 5 6]
ans =
4 5 6
8 10 12
12 15 18
İki tane rasgele matris oluşturup çarpalım. Alttaki örnekte çarpım sonucu
3x4lük bir matris oluşacak.
a = rand(3,2)
b = rand(2,4)
c = a * b
a =
0.6064 0.4890
0.8167 0.7607
0.8301 0.9151
b =
c =
16
Vektör ve matrislerle başka denemeler yapalım
a = [1 2; 3 4; 5 6];
b = [5 6 7];
b * a
ans =
58 76
c = [8; 9];
a * c
ans =
26
60
94
a = [1 3 2; 6 5 4; 7 8 9];
inv(a)
ans =
eig(a)
ans =
15.1601
-1.6860
1.5258
17
Hesaplamışken özvektörleri de bulalım. D matrisi köşegende özvektörleri
barındırır; V matrisi özvektörleri içerir. Bu, MATLAB ile birden çok değişken
döndürülmesine de güzel bir ornek!
[V, D] = eig(a)
V =
D =
15.1601 0 0
0 -1.6860 0
0 0 1.5258
[U, S, V] = svd(a)
U =
S =
16.7157 0 0
0 2.0802 0
0 0 1.1216
V =
18
Başka başka da matris fonksiyonları var: det, norm, rank, ...
Önce bir matris oluşturalım. Daha sonra onu doğrusal bir vektöre çevirelim.
Dikkat: Matrisleri diğer dillerdeki (c,c++,vb.) gibi satır satır değil de sütun
sütun düşünmek gerekir. a’nın sütunlarını ekleyerek yeni bir sütun vektörü
oluşturuyoruz.
a = [1 2; 3 4; 5 6];
b = a(:)
b =
1
3
5
2
4
6
sum(a(:))
ans =
21
a = reshape(b, 2, 3)
a =
1 5 4
3 2 6
19
İki tane satır vektörünü yatay olarak birleştirelim. (horzcat’a bakınız.)
a = [1 2]; b = [3 4];
c = [a b]
c =
1 2 3 4
a = [1; 2; 3];
b = [4; 5]
c = [a; b]
b =
4
5
c =
1
2
3
4
5
a = [eye(3) rand(3)]
a =
20
b =
1 0 0
0 1 0
0 0 1
1 1 1
b = repmat(5, 3, 2)
b =
5 5
5 5
5 5
b = repmat([1 2; 3 4], 1, 2)
b =
1 2 1 2
3 4 3 4
b = diag([1 2 3])
b =
1 0 0
0 2 0
0 0 3
21
Kontrol İşlemleri ve Vektörleme (Vectorization)
Döngüleri en azından bir dilde bildiğinizi bilerek hızlıca MATLAB’de nasıl
olduğuna bakalım.
while KOSUL
islemLER
end
if KOSUL
islemLER
elseif KOSUL
islemLER
else
islemLER
end
elseif ve else kısımları isteğe bağlıdır, end ise gereklidir.
Uyarı:
for i=1:2:7
i
end
22
i =
i =
i =
i =
Başka bir örnek: A adında mxn’lik bir matris ve v adında 1xnlik bir vektör
verilmiş olsun, v’yi A’nın her satırından çıkarmak istiyoruz.
m = 6; n = 3;
A = ones(m, n)
v = 2 * rand(1, n)
23
A =
1 1 1
1 1 1
1 1 1
1 1 1
1 1 1
1 1 1
v =
for i=1:m
A(i,:) = A(i,:) - v;
end
Aynı işlemi yalnızca matris işlemleri kullanarak da yapabilirdik. Peki nasıl?
A = ones(m, n) - repmat(v, m, 1)
A =
Örnek: mxn’lik A matrisi verilsin, aynı boyutta tum degerleri sıfır olan bir
B matrisi oluşturalım. Daha sonra B’ye, A’nın sıfırdan büyük olan elemanlarını
kopyalayalım.
24
B = zeros(m,n);
for i=1:m
for j=1:n
if A(i,j)>0
B(i,j) = A(i,j);
end
end
end
B
B =
0 0 0.3517
0 0 0.3517
0 0 0.3517
0 0 0.3517
0 0 0.3517
0 0 0.3517
Tüm bu işlemler hiç dongu kullanmadan yapılabilir! A’nın 0’dan büyük el-
emanlarının indekslerini buluruz. B’ye, A’da bulunan indekslerdeki elemanları
kopyalarız.
B = zeros(m,n);
ind = A > 0
ind =
0 0 1
0 0 1
0 0 1
0 0 1
0 0 1
0 0 1
B(ind) = A(ind)
B =
0 0 0.3517
0 0 0.3517
0 0 0.3517
25
0 0 0.3517
0 0 0.3517
0 0 0.3517
Değişkenleri/Oturumu Kaydetmek
Bugün oturduk, çalıştık... Yorulduk, aynı değişkenlerle sonradan çalışalım
dedik...
save dosyam
Sadece a ve b değişkenlerini kaydetmek isteseydik:
save dosyam a b
Peki bu iki değişkeni kaydetmek değil de silmek isteseydik:
clear a b
clear
load dosyam
a = 10;
b = 2*a;
26
Şimdi de komut satırından şunları girelim
a = 2;
b = 3;
betigim();
a
a =
10
b =
20
Fonksiyonun adı dosya adı ile aynı olmalıdır. Örnegin ”fonksiyonum” fonksiy-
onu ”fonksiyonum.m” dosyasına koyulmalıdır. Örnek olarak fonksiyonum.m ve
digerfonksiyonum.m dosyalarına bakiniz.
27
function y = fonksiyonum(x)
a = [-2 -1 0 1];
y = a + x;
y = a + b;
z = a - b;
a = [1 2 3 4];
b = fonksiyonum(2 * a)
a
b =
0 3 6 9
a =
1 2 3 4
[c, d] = digerfonksiyonum(a, b)
c =
1 5 9 13
d =
1 -1 -3 -5
28
Grafik Çizdirme
Belki MATLAB’in en güçlü yanı çizebildiği çeşitli güzel grafiklerdir. Önce temel
çizim fonksiyonumuz plot ile başlayalım.
y = [0 1 5 2 3];
y’yi indeks degerleri ile grafik olarak çizelim. Yani dikey eksen y’nin değerleri
olsun, yatay eksense 1’den başlayıp y’nin boyuna kadar gitsin.
plot(y)
4.5
3.5
2.5
1.5
0.5
0
1 1.5 2 2.5 3 3.5 4 4.5 5
İstersek yatay eksen değerlerini de verebiliriz. Üstüne axis ile görüntülenen
sınırları belirleyebiliriz. Kullanımı: axis([enkucukx enbuyukx enkucuky
enbuyuky])
x = linspace(0,1,length(y));
plot(x, y);
axis([-0.5 1.5 -0.2 5.2]);
29
5
4.5
3.5
2.5
1.5
0.5
0
−0.5 0 0.5 1 1.5
Normalde yeni bir figür çizdiğimizde en son aktif olan figürün üstüne çizilir.
Eğer yeni bir figür açmak istersek figure yazabiliriz. Şimdi de bir sinüs grafiği
çizelim ve biraz da süsleyelim.
figure
x = pi*[-24:24]/24;
plot(x, sin(x))
xlabel(’radyan’)
ylabel(’sinüs değeri’)
title(’Sinüs Grafiği’)
30
Sinüs Grafiði
1
0.8
0.6
0.4
0.2
sinüs deðeri
−0.2
−0.4
−0.6
−0.8
−1
−4 −3 −2 −1 0 1 2 3 4
radyan
Bazen aynı figüre bir çizim yapmak yerine küçük pencereler halinde
daha çok çizim yapmak isteyebiliriz. Bunun için de subplot im-
dadımıza yetişiyor. Kullanım: subplot(satir sayisi, sutun sayisi,
su an cizilecek olanin indeksi)
subplot(1, 2, 1)
plot(x, sin(x))
axis square
title(’Sin grafiği’)
subplot(1, 2, 2);
plot(x, cos(x));
axis square
title(’Cos grafiği’)
0.5 0.5
0 0
−0.5 −0.5
−1 −1
−4 −2 0 2 4 −4 −2 0 2 4
31
Yukarıda görüntülenen alanları kare yaptık. Başka seçenekler de koyabilirdik.
help axis ile görebilirsiniz.
Şimdi de aynı çizim alanına birden fazla çizim yapalım. Bunun için
hold on ve hold off kullanmamız gerekecek. Bu komutlarla yeni çizim
yapılırken eski çizimin üstüne yapılıp yapılmayacağı belirlenir. İstersek
plot(x1,y1,x2,y2,x3,y3,...) şeklinde de birden çok çizim yapabilirdik.
Fakat böyle tercih etmemin sebebi çizimlerin özelliklerini ayrı ayrı belirleye-
bilmek.
Alttaki örnekte ’:’ parametresi kesik çizgili doğru çizer. help plot ile doğru
ve nokta şekillerine bakabilirsiniz. Pek çok güzel seçenek mevcut. legend ile de
çizimlerin adlarını koyabiliriz.
figure
plot(x, sin(x), ’-g’);
hold on
plot(x, cos(x), ’--r’)
legend(’sin’, ’cos’)
hold off
1
sin
0.8 cos
0.6
0.4
0.2
−0.2
−0.4
−0.6
−0.8
−1
−4 −3 −2 −1 0 1 2 3 4
Bundan sonra tekrar çizim yapan fonksiyonlardan herhangi birini (plot, stem,
bar, stairs, vb.) cağırırsanız eski çizim silinir ve sadece yeni çizim gözükür.
Haydi örnek olarak stem fonksiyonu çizelim, biraz da varyete ekleyelim.
stem(x,sin(x), ’--ro’,’LineWidth’,2,...
’MarkerEdgeColor’,’k’,...
32
’MarkerFaceColor’,’g’,...
’MarkerSize’,7)
title(’Sin grafiği’)
Sin grafiði
1
0.8
0.6
0.4
0.2
−0.2
−0.4
−0.6
−0.8
−1
−4 −3 −2 −1 0 1 2 3 4
Matrisleri resim gibi çizmeye bakalım.
m = rand(16,16);
imagesc(m)
33
2
10
12
14
16
2 4 6 8 10 12 14 16
Renklendirme haritasi olarak gri kullanalım, eksenleri silelim ve oranları pik-
seller kare görünecek şekilde sabitleyelim.
colormap gray
axis image
axis off
34
İşimiz bitti, tüm figürleri kapatalım. Not: Sadece close kullansaydık şu anki
figürü kapatırdık.
close all
İpucu: Eğer döngülerin içinde plot fonksiyonunu (veya diğer çizim fonksiy-
onlarını) cağırırsanız her döngüdeki sonuç yerine son sonucu gorebilirsiniz. Tüm
çizim sonuçlarını animasyon şeklinde görmek için plot fonksiyonundan sonra
döngü içine drawnow komutunu giriniz.
35
clear i j
i
i =
j =
x = 1 + 4i
x =
1.0000 + 4.0000i
x = real(x) + imag(x)*i
x =
25
theta = pi/4
y = cos(theta) + sin(theta)*j
theta =
0.7854
y =
2.8284
36
Yukarıdaki örneği, Euler formülünü kullanarak da hesaplayalım, bakalım aynı
mı?
y = exp(i*theta)
y =
111.3178
v = [x y 5-7i]
v =
1.0e+002 *
A =
1.0e+002 *
B = rand(size(A)) + rand(size(A))*i
B =
37
C1 = B’
C1 =
3.9253 3.1600
2.1550 0.9662
4.9717 1.8957
C2 = B.’
C2 =
3.9253 3.1600
2.1550 0.9662
4.9717 1.8957
A + B
ans =
1.0e+002 *
A - B
ans =
1.0e+002 *
A * A’
38
ans =
1.0e+004 *
A .* B
ans =
1.0e+002 *
sum(sum(A(:,1) * B(2,:)))
ans =
210.7658
mean(B(:))
ans =
2.8456
x = rand(8,1)
39
x =
0.2804
0.2594
0.5471
0.5413
0.7881
0.8696
0.7875
0.9694
y = fft(x)
y =
5.0429
-0.6364 + 0.9747i
-0.2661 + 0.3817i
-0.3790 + 0.4938i
-0.2366
-0.3790 - 0.4938i
-0.2661 - 0.3817i
-0.6364 - 0.9747i
Artık rahatça resimleri matris şeklinde okuma ve üzerinde işlem yapma konu-
larına geçebiliriz. Bir dahaki yazıda kaldığımız yerden devam edelim...
http://www.cs.brown.edu/courses/cs143/MatlabTutorialCode.html’den yola
çıkarak yeni birçok ekleme ile Türkçe’ye uyarlanmıştır.
40