Download as pdf or txt
Download as pdf or txt
You are on page 1of 40

MATLAB Programlama Notları

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.

Aşağıdaki kodları MATLAB komut satırına sırası ile girip sonuçlarını


gözlemleyerek güzel bir başlangıç yapabilirsiniz.

Ş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.

Buyurun, temel MATLAB programlamaya hızlıca giriş notları...

İç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:

İşlere girişmeden önce clear ile ortamdaki değişkenleri temizleyelim ve clc


ile de komut ekranını temizleyelim

clear
clc
MATLAB komut satırı komut sistemine (kabuk) benzetilebilir:

• Komutları tekrar yazmak yerine yukarı oku kullanın ( benzer şekilde


geçmiste ileriye gitmek için ise aşağı oku kullanabilirsiniz ) Önce birkaç
karakter yazarsanız, yukarı/aşağı okla o karakterlerle başlayan komutları
gezebilirsiniz. Bu size çok hız kazandıracaktır
Komut satırındayken

• Ctrl-a satır basina, Ctrl-e satir sonuna gider


• Ctrl-f bir karakter ileri (sağa ok), Ctrl-b bir karakter geri (sola ok) gider
• Ctrl-d bir karakteri, Ctrl-k satirin sagda kalanini siler
• Ctrl-p komut geçmişinde bir öncekine (yukarı ok) gider
• Ctrl-n komut geçmişinde bir sonrakine (aşağı ok) gider
• Tab komut tamamlamaya yarar

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.

MATLAB’de Temel Veri Yapıları


(A) MATLAB’de temel yapılar:

skalar sayılar ( genellikle ”double”-kesinliğinde gerçel sayılar), vektörler ve


matrislerdir:

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.

Ben örneklerde, sonuçları görmek için sonlarına ; eklemeyeceğim. Siz isters-


eniz ekleyebilirsiniz. Sonuçları bize döndürdüğü için MATLAB’i çk gelişmiş bir
hesap makinesi olarak düşünebiliriz.

N = 5

N =

Satır ve sütun vektörleri oluşturalım. Matris tanımı içinde ; kullanırsak alt


satıra geç demek oluyor.

v = [1 0 0]
v = [1; 2; 3]

v =

1 0 0

v =

1
2
3

v vektörünün transpozesini alalım.

Dikkat: Tek tırnak sembolü eşlenik transpoze içindir. Karmaşık sayılarla


çalışırken hangisini kullandığınız önemlidir.

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 =

1.0000 1.5000 2.0000 2.5000 3.0000

v =

-3.1416 -1.5708 0 1.5708 3.1416

Başka bir yol da mümkün: linspace(baslangic,bitis,kac parca)

v = linspace(1,3,5)

v =

1.0000 1.5000 2.0000 2.5000 3.0000

Peki boş değişken oluşturmak isteseydik

v = []

v =

[]

5
(B) Özel matrisler oluşturma:

İlk parametre SATIRSAYISI, 2. parametre SUTUNSAYISInı belirtir

2x3lük sıfır ve bir matrisleri oluşturalım

m = zeros(2, 3)
v = ones(2, 3)

m =

0 0 0
0 0 0

v =

1 1 1
1 1 1

3lük birim matris oluşturalım

m = eye(3)

m =

1 0 0
0 1 0
0 0 1

Rasgele sayılar içeren 3x1lik matris (sütun vektörü); randn’e de bakınız

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

(C) Vektör ve matrisleri indeksleme:

Uyarı: İndeksler her zaman 1 ile başlar (0 ile değil)!

Vektör elemanına ulaşma

v = [1 2 3];
v(3)

ans =

2. elemanı silmek isteseydik

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

1. satırın 1’den 3’e kadar (dahil) elemanları

m(1, 1:3)

ans =

1 2 3

2. sütunun 2’den 3’e kadar (dahil) elemanları

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

Matrisin boyutunu gösterelim

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

Your variables are:

A B N ans m m1 v

Değişkenleri boyut, tip, vb. bilgileriyle görelim

whos

Name Size Bytes Class Attributes

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

Bu arada, ans diye gözüken değişken en son yaptığımız ve herhangi bir


değişkene atamadığımız değer. Yani answer demek.

Vektör ve Matrisler Üzerinde Basit İşlemler


(A) Eleman bazında yapılan işlemler:

Bu işlemler ”eleman eleman” yapılan işlemlerdir. Eğer iki vektör/matris


toplama, çıkarma, çarpma veya bölme işlemine sokulacaksa aynı boyutta ol-
malıdır.

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

Vektörlerde toplama (matrislerde de aynı) ve çıkarma

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

Eleman eleman logaritma alma ve en yakın tamsayıya yuvarlama.

log([1 2 3 4])

ans =

0 0.6931 1.0986 1.3863

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, ...

ipucu: MATLAB yorumlayıcı olduğu için döngülerde yavaş çalışır. O


yüzden kullanacağınız işlemleri eleman bazında işlemler şeklinde tanımlamak
işleri hızlandırır. bakınız: (4) Vektörleme

(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

Vektör elemanlarının toplamı

sum(a)

ans =

14

Vektör elemanlarının aritmetik ortalaması

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

En yüksek ve en düşük değerler

max(a)

ans =

min(a)

ans =

Eğer matris üzerinde işlem yapılırsa, bu fonksiyonlar matrisin her bir


sütununda işlem yaparlar ve sonuç olarak bir satır vektörü döndürürler

a = [1 2 3; 4 5 6]

a =

1 2 3
4 5 6

14
Her sütunun ortalaması

mean(a)

ans =

2.5000 3.5000 4.5000

Her satırın en yüksek değeri

max(a)

ans =

4 5 6

Matristeki en yüksek değer

max(max(a))

ans =

Her satırın ortalaması (ikinci arguman hangi boyutta işlem yapilacagini


gösterir)

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

(C) Matris işlemleri:

İ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 =

0.9010 0.5471 0.1944 0.4756


0.2142 0.7847 0.7469 0.5833

c =

0.6511 0.7155 0.4832 0.5736


0.8988 1.0437 0.7270 0.8321
0.9439 1.1722 0.8449 0.9285

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

Matrisin tersini hesaplayalım.

a = [1 3 2; 6 5 4; 7 8 9];
inv(a)

ans =

-0.3333 0.2821 -0.0513


0.6667 0.1282 -0.2051
-0.3333 -0.3333 0.3333

a’nın özdeğerlerinden oluşan vektör

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 =

-0.2199 -0.7374 -0.2033


-0.4671 0.6751 -0.5675
-0.8564 -0.0224 0.7979

D =

15.1601 0 0
0 -1.6860 0
0 0 1.5258

a’nın ”singular value decomposition” sonucu. a = U * S * V’, a’nın ”singu-


lar” değerleri S’de bulunur

[U, S, V] = svd(a)

U =

-0.2097 0.4071 -0.8890


-0.5147 -0.8190 -0.2536
-0.8313 0.4044 0.3813

S =

16.7157 0 0
0 2.0802 0
0 0 1.1216

V =

-0.5454 -0.8059 0.2302


-0.5895 0.1736 -0.7889
-0.5959 0.5660 0.5697

18
Başka başka da matris fonksiyonları var: det, norm, rank, ...

(D) Matrisleri yeniden şekillendirme ve birleştirme:

Ö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

Tüm elemanların toplamını almak isteseydik

sum(a(:))

ans =

21

b vektörünün elemanlarından 2x3lük bir matris oluşturalım (yine sütun


sütun)

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

İki tane sütun vektörünü dikey olarak birleştirelim. (vertcat’a bakınız.)

a = [1; 2; 3];
b = [4; 5]
c = [a; b]

b =

4
5

c =

1
2
3
4
5

Benzer şekilde matrisleri de birleştirebiliriz.

a = [eye(3) rand(3)]

a =

1.0000 0 0 0.2605 0.9171 0.7630


0 1.0000 0 0.0848 0.4705 0.7722
0 0 1.0000 0.2981 0.2695 0.0213

b = [eye(3); ones(1, 3)]

20
b =

1 0 0
0 1 0
0 0 1
1 1 1

repmat kullanarak bir değişkeni ızgara şeklinde kopyalayabiliriz. Örneğin tüm


değerleri 5 olan 3x2lik bir matris yapalım.

b = repmat(5, 3, 2)

b =

5 5
5 5
5 5

İlla ki tek değer olması gerekmezdi. Bir matrisi de klonlayabilirdik.

Kullanım: repmat(kopyalanacak veri,satir sayisi,sutun sayisi)

b = repmat([1 2; 3 4], 1, 2)

b =

1 2 1 2
3 4 3 4

Verilen vektörle 3x3lük bir koşegen matrisi oluşturalım.

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.

Kontrol işlemlerinin sentaksı:

for DEGISKEN = DEGERLER


islem
...
islem
end
DEGERLER döngünün hangi degerler icin yapılacağı vektör olmalıdır, örneğin:
1:10 veya -1:0.5:1 veya [1 4 7]

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.

KOSUL|lar genellikle ilişkilerden oluşur, örneğin |a < b

Operatörler: ˜, <, >, <=, >=, ==, ˜= (C’deki ! yerine ˜ kullanılır)


KOSUL|lar |&& (ve), || (veya) ile kullanılabilir. Ör. a < b && ( c != d \\|
e >= f)|

Uyarı:

Döngüler MATLAB’de çok yavaş çalışır. İşlemlerinizi hızlandırmak için


mümkün olan yerlerde vektörleme yapmalısınız. Ör: Kodunuzu matris
işlemleriyle tekrar yazmalısınız. Aşağıda birkaç örnek bulacaksınız.

1’den 7’ye kadar 2 atlayarak döngü oluşturalım ve i’yi ekrana basalım.

for i=1:2:7
i
end

22
i =

i =

i =

i =

Verilen bir vektör üstünde döngü oluşturalım. İçine bir de if kontrolü


koyalım.

for i=[5 13 -1]


if (i > 10)
disp([int2str(i) ’ sayısı 10dan büyük’])
elseif i < 0
disp([int2str(i) ’ sayısı negatif bir sayı’])
else
disp([int2str(i) ’ sayısı 0 ile 10 arasında’])
end
end

5 sayısı 0 ile 10 arasında


13 sayısı 10dan büyük
-1 sayısı negatif bir sayı

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 =

1.7600 1.5963 0.6483

Döngü kullanarak şöyle yapabiliriz

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 =

-0.7600 -0.5963 0.3517


-0.7600 -0.5963 0.3517
-0.7600 -0.5963 0.3517
-0.7600 -0.5963 0.3517
-0.7600 -0.5963 0.3517
-0.7600 -0.5963 0.3517

Bu hali (özellikle bu işleme cok kez ihtiyaciniz varsa) işinizi hızlandıracaktır!!!

Döngüler koşullu işlemler içerse dahi vektörleme yapabiliriz

Ö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.

Döngü kullanarak hesaplama:

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

Alttaki kullanım tüm calışma alanı değişkenlerini dosyam.mat dosyasına kayd-


eder. Bulunduğunuz klasöre bir göz atın, dosya orada duruyor mu bakalım?

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

Tüm değişkenleri silelim:

clear

Kaydettiğimiz değişkenleri geri yükleyelim

load dosyam

m-dosyaları ile Betikler ve Fonksiyonlar Yazma:


MATLAB ile betik dosyası oluşturma

MATLAB betikleri ”.m” uzantısı olan ve MATLAB kodları içeren dosyalardır.


Dosya içindeki değişkenler global çalışırlar ve o anki MATLAB oturumunda
ortamda bulunan aynı isimdeki değiskenleri değiştirir. ”betigim.m” adındaki
bir betiği ”betigim” yazarak komut satırından çalıştırabilirsiniz.

Mesela alttaki kodu betigim.m olarak kaydedin.

a = 10;
b = 2*a;

26
Şimdi de komut satırından şunları girelim

a = 2;
b = 3;
betigim();
a

a =

10

b =

20

Görüldüğü üzere tanımladığımız değişkenler betik içinde yeni değerlere


atandı. Bu tehlikeli olabilir. Gelin fonksiyon yazmaya geçelim.

MATLAB ile fonksiyon yazma

Fonksiyonlar da m-dosyalarıdır. Farklı olarak bir fonksiyonun ilk satırı söyle


olmalıdır:

function [sonuc1, sonuc2, ..., sonucm] = fonksiyonum(arg1, arg2,...,argn)

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.

Fonksiyonlar lokal ortamda çalıştırırlar. Yani ana calışma alanındaki aynı


isimdeki bir değişkeni kaybetme riskiniz yoktur. Fonksiyonun sonucunda sadece
sonuc olarak dönen deüişkenler, çağıran fonksiyonun çalışma alanında görülür.

Örnekleri yapmadan önce aşağıdaki fonksiyonları çalışma dizininize kaydedin.

fonksiyonum.m: Tek girdi argumanı alan ve tek değer döndüren örnek


fonksiyon

27
function y = fonksiyonum(x)

a = [-2 -1 0 1];
y = a + x;

digerfonksiyonum.m: 2 girdi argumanı alan ve 2 değer döndüren örnek


fonksiyon

function [y, z] = digerfonksiyonum(a, b)

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

Görüldüğü üzere a değeri değişmedi. Şimdi de iki değişken döndüren


örneğimizi çağıralım

[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’)

Sin grafiði Cos grafiði


1 1

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.

Karmaşık Sayılarla İşlemler


MATLAB’de gerçel sayılar dışında karmaşık sayılarla da işlem yapılabilir.
Karmaşık sayılar için ”complex” veri tipi vardır. Karmaşık sayıları tanımlarken
sanal değerleri için i veya j kullanılabilir. Daha önceden i veya j’yi
başka değerlere atadıysanız (örneğin bir döngüde sayaç olarak) sanal birim
olarak kullanamazsınız. i ve j olarak ayrı ayrı olması mühendislerin j,
fizikçilerin/matematikçilerin i kullanmasıdır.

Biz her ihtimale karşı önceden tanımlanan i ve j değerlerini silelim ki sanal


birim için güvenle kullanabilelim.

35
clear i j
i

i =

j =

Değişik karmaşık sayılar oluşturalım

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

Skalar değerler gibi, vektör ve matrisleri oluşturmak da mümkün:

v = [x y 5-7i]

v =

1.0e+002 *

0.2500 1.1132 0.0500 - 0.0700i

A = [v;4+i 3-8j -2-2j]

A =

1.0e+002 *

0.2500 1.1132 0.0500 - 0.0700i


0.1000 0.0300 - 0.0800i -0.0200 - 0.0200i

B = rand(size(A)) + rand(size(A))*i

B =

3.9253 2.1550 4.9717


3.1600 0.9662 1.8957

Şimdi transpoze ve eşlenik transpozeyi tekrardan hatırlayalım. Sadece tek


tırnak koyarsak, bu elemanların eşleniğini de alır. Eşlenik almadan transpoze
yapmak istersek .’ kullanmalıyız.

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

Gerçel sayılardaki tüm işlemler karmaşık sayılarla da yapılabilir. Örneğin


toplama, çıkarma, matris çarpımı, eleman eleman çarpım, fonksiyonlar, vb.

A + B

ans =

1.0e+002 *

0.2893 1.1347 0.0997 - 0.0700i


0.1316 0.0397 - 0.0800i -0.0010 - 0.0200i

A - B

ans =

1.0e+002 *

0.2107 1.0916 0.0003 - 0.0700i


0.0684 0.0203 - 0.0800i -0.0390 - 0.0200i

A * A’

38
ans =

1.0e+004 *

1.3091 0.0588 + 0.0915i


0.0588 - 0.0915i 0.0181

A .* B

ans =

1.0e+002 *

0.9813 2.3989 0.2486 - 0.3480i


0.3160 0.0290 - 0.0773i -0.0379 - 0.0379i

sum(sum(A(:,1) * B(2,:)))

ans =

210.7658

mean(B(:))

ans =

2.8456

Gerçel değerli değiskenler ile karmaşık değerli değişkenlerin sonucu karmaşık


değerlidir.

Bazı fonksiyonlar karmaşık değerler döndürebilir. Örneğin hızlı Fourier


dönüsümü karmaşık sayılar döndürür.

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

Sanırım başlangıç için bu kadar yeterli! Takıldığınız yerde MATLAB’in


yardımını kullanabilirsiniz.

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.

İsmail Arı Son değiştirilme: 01.04.2008

40

You might also like