40
MATLAB Programlama Notları v 0.1 ˙ Ismail Arı 1 Nisan 2008 1

MATLAB Programlama Notlar‡ - ismailari.comismailari.com/wp-content/.../2008/04/matlabileprogramlamayagiris.pdf · Matlab Programlamaya Giri»s G˜orun˜ tu˜ i»sleme kodlar‡n‡

Embed Size (px)

Citation preview

Page 1: MATLAB Programlama Notlar‡ - ismailari.comismailari.com/wp-content/.../2008/04/matlabileprogramlamayagiris.pdf · Matlab Programlamaya Giri»s G˜orun˜ tu˜ i»sleme kodlar‡n‡

MATLAB Programlama Notları

v 0.1

Ismail Arı

1 Nisan 2008

1

Page 2: MATLAB Programlama Notlar‡ - ismailari.comismailari.com/wp-content/.../2008/04/matlabileprogramlamayagiris.pdf · Matlab Programlamaya Giri»s G˜orun˜ tu˜ i»sleme kodlar‡n‡

Matlab Programlamaya Giris

Goruntu isleme kodlarını anlamak icin oncelikle MATLAB bilmek gerekiyor. Bi-raz baktım da, internette derli toplu Turkce bir MATLAB programlama kaynagıyok. Daha dogrusu olanlar o kadar yavas ilerliyor ki... Programlama bilip dehızlıca MATLAB ogrenmek isteyenlere pek uygun gozukmuyor. Guzel bir kay-nak oldugunu dusundugum kodları acıklamalarıyla birlikte gondereyim istedim.

Asagıdaki kodları MATLAB komut satırına sırası ile girip sonuclarınıgozlemleyerek guzel bir baslangıc yapabilirsiniz.

Simdilik yuzeysel bir ders (’tutorial’) oldu.. Biraz (!) zamanımı alıyoracıkcası. Eklemeler olursa sonraki yazı(lar)da genisletirim. Daha sonra da ra-hatca goruntu isleme calısmalarına baslayabilecegim.

Buyurun, temel MATLAB programlamaya hızlıca giris notları...

Icindekiler

• Baslamadan• MATLAB’de Temel Veri Yapıları• Vektor ve Matrisler Uzerinde Basit Islemler• Kontrol Islemleri ve Vektorleme (Vectorization)• Degiskenleri/Oturumu Kaydetmek• m-dosyaları ile Betikler ve Fonksiyonlar Yazma:• Grafik Cizdirme• Karmasık Sayılarla Islemler

Baslamadan

”%” sembolu yorumlar icin kullanılır (satır sonuna kadar) ipucu: Birden fazlasatir icin hataAyiklama diye global bir degisken tanımlayıp

if hataAyiklamaislemler

end

seklinde yazabilirsiniz

Tek satırda kullanmak icin oldukca uzun olan bir islem yazacagınız zaman altsatıra gectiginizi belirtmek amacıyla satır sonuna ... ekleyin. Or:

A = [1, 2; ...3, 4];

2

Page 3: MATLAB Programlama Notlar‡ - ismailari.comismailari.com/wp-content/.../2008/04/matlabileprogramlamayagiris.pdf · Matlab Programlamaya Giri»s G˜orun˜ tu˜ i»sleme kodlar‡n‡

Islem sonuna noktalı virgul konulursa MATLAB sonucu ekrana basmaz. Eger”;” eklemezseniz sonuc goruntulenir. Degiskenlerin degerlerini gormek icin fay-dalıdır. Or:

A

Islere girismeden once clear ile ortamdaki degiskenleri temizleyelim ve clcile de komut ekranını temizleyelim

clearclc

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

• Komutları tekrar yazmak yerine yukarı oku kullanın ( benzer sekildegecmiste ileriye gitmek icin ise asagı oku kullanabilirsiniz ) Once birkackarakter yazarsanız, yukarı/asagı okla o karakterlerle baslayan komutlarıgezebilirsiniz. Bu size cok hız kazandıracaktır

Komut satırındayken

• Ctrl-a satır basina, Ctrl-e satir sonuna gider• Ctrl-f bir karakter ileri (saga ok), Ctrl-b bir karakter geri (sola ok) gider• Ctrl-d bir karakteri, Ctrl-k satirin sagda kalanini siler• Ctrl-p komut gecmisinde bir oncekine (yukarı ok) gider• Ctrl-n komut gecmisinde bir sonrakine (asagı ok) gider• Tab komut tamamlamaya yarar

Basit hata ayiklama: Eger ”dbstop if error” calisma sırasında hata verenbir betigi/fonksiyonu calıstırmadan once yazılmıssa, program hatanın olduguyerde durur. Hata ayıklamak icin cok ise yarayabilir. Ama bana kalırsa entemizi ”breakpoint” koyarak hata ayıklamaktır. Program o noktaya geldigindeistediginiz degiskeni gozlemleyebilirsiniz.

MATLAB’de Temel Veri Yapıları

(A) MATLAB’de temel yapılar:

skalar sayılar ( genellikle ”double”-kesinliginde gercel sayılar), vektorler vematrislerdir:

Not: Aslinda bunlarin hepsi birer matristir. Ornegin skalar bir sayı 1x1likbir matrisdir.

3

Page 4: MATLAB Programlama Notlar‡ - ismailari.comismailari.com/wp-content/.../2008/04/matlabileprogramlamayagiris.pdf · Matlab Programlamaya Giri»s G˜orun˜ tu˜ i»sleme kodlar‡n‡

2x2lik matrisler yaratalım. Matris yaratmanın en basit yolu elemanlarını kareparantez icinde yazmaktır. ; sembolu satırları, (istege baglı) , ise sutunlariayırır.

A = [1 2; 3 4];B = [1,2; 3,4];

Goruldugu uzere noktalı virgulle bitirdigimiz icin sonuclar ekrana basılmadı.Simdi skalar bir deger olusturalım.

Ben orneklerde, sonucları gormek icin sonlarına ; eklemeyecegim. Siz isters-eniz ekleyebilirsiniz. Sonucları bize dondurdugu icin MATLAB’i ck gelismis birhesap makinesi olarak dusunebiliriz.

N = 5

N =

5

Satır ve sutun vektorleri olusturalım. Matris tanımı icinde ; kullanırsak altsatıra gec demek oluyor.

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

v =

1 0 0

v =

123

v vektorunun transpozesini alalım.

Dikkat: Tek tırnak sembolu eslenik transpoze icindir. Karmasık sayılarlacalısırken hangisini kullandıgınız onemlidir.

4

Page 5: MATLAB Programlama Notlar‡ - ismailari.comismailari.com/wp-content/.../2008/04/matlabileprogramlamayagiris.pdf · Matlab Programlamaya Giri»s G˜orun˜ tu˜ i»sleme kodlar‡n‡

v = v.’

v =

1 2 3

Vektor degerlerini teker teker yazmak zor sanki boyle. Gelin ko-layına kacıp belli aralıklar ile doldurulmus vektor olusturalım. Kullanım:[baslangic:adım:bitis]

v = 1:.5:3v = pi*[-4:2:4]/4 % (kare parantezler istege baglı)

v =

1.0000 1.5000 2.0000 2.5000 3.0000

v =

-3.1416 -1.5708 0 1.5708 3.1416

Baska bir yol da mumkun: linspace(baslangic,bitis,kac parca)

v = linspace(1,3,5)

v =

1.0000 1.5000 2.0000 2.5000 3.0000

Peki bos degisken olusturmak isteseydik

v = []

v =

[]

5

Page 6: MATLAB Programlama Notlar‡ - ismailari.comismailari.com/wp-content/.../2008/04/matlabileprogramlamayagiris.pdf · Matlab Programlamaya Giri»s G˜orun˜ tu˜ i»sleme kodlar‡n‡

(B) Ozel matrisler olusturma:

Ilk parametre SATIRSAYISI, 2. parametre SUTUNSAYISInı belirtir

2x3luk sıfır ve bir matrisleri olusturalım

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

m =

0 0 00 0 0

v =

1 1 11 1 1

3luk birim matris olusturalım

m = eye(3)

m =

1 0 00 1 00 0 1

Rasgele sayılar iceren 3x1lik matris (sutun vektoru); randn’e de bakınız

v = rand(3, 1)

v =

0.10840.98350.2483

6

Page 7: MATLAB Programlama Notlar‡ - ismailari.comismailari.com/wp-content/.../2008/04/matlabileprogramlamayagiris.pdf · Matlab Programlamaya Giri»s G˜orun˜ tu˜ i»sleme kodlar‡n‡

Dikkat: Eger iki degil de bir parametre verirsek, ornegin 3x3luk sıfır matrisiolusturur (vektor degil!)

m = zeros(3)

m =

0 0 00 0 00 0 0

(C) Vektor ve matrisleri indeksleme:

Uyarı: Indeksler her zaman 1 ile baslar (0 ile degil)!

Vektor elemanına ulasma

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

ans =

3

2. elemanı silmek isteseydik

v(2) = []

v =

1 3

Matris bir tane elemanına ulasmak icin 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

Page 8: MATLAB Programlama Notlar‡ - ismailari.comismailari.com/wp-content/.../2008/04/matlabileprogramlamayagiris.pdf · Matlab Programlamaya Giri»s G˜orun˜ tu˜ i»sleme kodlar‡n‡

5 7 8 89 10 11 12

13 14 15 16

ans =

3

Matrisin tum satırına ulasma (2. satır) ve tum sutununa ulasma (1. sutun)

m(2, :)m(:, 1)

ans =

5 7 8 8

ans =

159

13

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

m(1, 1:3)

ans =

1 2 3

2. sutunun 2’den 3’e kadar (dahil) elemanları

m(2:3, 2)

ans =

710

8

Page 9: MATLAB Programlama Notlar‡ - ismailari.comismailari.com/wp-content/.../2008/04/matlabileprogramlamayagiris.pdf · Matlab Programlamaya Giri»s G˜orun˜ tu˜ i»sleme kodlar‡n‡

Anahtar sozcuk end satır/sutun’daki son elemana kadar demektir

m(2:end, 3)

ans =

81115

Matrisin boyutunu gosterelim

m = [1 2 3; 4 5 6]size(m)

m =

1 2 34 5 6

ans =

2 3

Satır sayısı

size(m, 1)

ans =

2

Sutun sayısı

size(m, 2)

ans =

3

9

Page 10: MATLAB Programlama Notlar‡ - ismailari.comismailari.com/wp-content/.../2008/04/matlabileprogramlamayagiris.pdf · Matlab Programlamaya Giri»s G˜orun˜ tu˜ i»sleme kodlar‡n‡

m ile aynı boyutta yeni bir matris olusturmak istersek

m1 = zeros(size(m))

m1 =

0 0 00 0 0

Su ana kadar bir hayli calıstık. Calısma alanindaki degiskenleri gorelim

who

Your variables are:

A B N ans m m1 v

Degiskenleri boyut, tip, vb. bilgileriyle gorelim

whos

Name Size Bytes Class Attributes

A 2x2 32 doubleB 2x2 32 doubleN 1x1 8 doubleans 1x1 8 doublem 2x3 48 doublem1 2x3 48 doublev 1x2 16 double

Bu arada, ans diye gozuken degisken en son yaptıgımız ve herhangi birdegiskene atamadıgımız deger. Yani answer demek.

Vektor ve Matrisler Uzerinde Basit Islemler

(A) Eleman bazında yapılan islemler:

Bu islemler ”eleman eleman” yapılan islemlerdir. Eger iki vektor/matristoplama, cıkarma, carpma veya bolme islemine sokulacaksa aynı boyutta ol-malıdır.

10

Page 11: MATLAB Programlama Notlar‡ - ismailari.comismailari.com/wp-content/.../2008/04/matlabileprogramlamayagiris.pdf · Matlab Programlamaya Giri»s G˜orun˜ tu˜ i»sleme kodlar‡n‡

Sutun vektorunu skalar ile carpma ve skalara bolme

a = [1 2 3 4]’;2 * a

ans =

2468

a / 4

ans =

0.25000.50000.75001.0000

Vektorlerde toplama (matrislerde de aynı) ve cıkarma

b = [5 6 7 8]’;a + b

ans =

68

1012

a - b

ans =

-4-4-4-4

11

Page 12: MATLAB Programlama Notlar‡ - ismailari.comismailari.com/wp-content/.../2008/04/matlabileprogramlamayagiris.pdf · Matlab Programlamaya Giri»s G˜orun˜ tu˜ i»sleme kodlar‡n‡

Eleman eleman kare alma, carpma ve bolme. .’ya dikkat edin! Normal sem-boller matris carpma ve bolmesi demek!

a .^ 2

ans =

149

16

a .* b

ans =

5122132

a ./ b

ans =

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

Page 13: MATLAB Programlama Notlar‡ - ismailari.comismailari.com/wp-content/.../2008/04/matlabileprogramlamayagiris.pdf · Matlab Programlamaya Giri»s G˜orun˜ tu˜ i»sleme kodlar‡n‡

round([1.5 2; 2.2 3.1])

ans =

2 22 3

Benzer sekilde eleman eleman islem yapabilen bircok fonksiyon vardır. Or: :floor, ceil, ...

ipucu: MATLAB yorumlayıcı oldugu icin dongulerde yavas calısır. Oyuzden kullanacagınız islemleri eleman bazında islemler seklinde tanımlamakisleri hızlandırır. bakınız: (4) Vektorleme

(B) Vektor islemleri Vektorlerde islem yapan onceden tanımlı bazı MAT-LAB fonksiyonları

a = [1 4 6 3]

a =

1 4 6 3

Vektor elemanlarının toplamı

sum(a)

ans =

14

Vektor elemanlarının aritmetik ortalaması

mean(a)

ans =

3.5000

13

Page 14: MATLAB Programlama Notlar‡ - ismailari.comismailari.com/wp-content/.../2008/04/matlabileprogramlamayagiris.pdf · Matlab Programlamaya Giri»s G˜orun˜ tu˜ i»sleme kodlar‡n‡

Vektor elemanlarının degisintisi (varyans)

var(a)

ans =

4.3333

Standart sapma

std(a)

ans =

2.0817

En yuksek ve en dusuk degerler

max(a)

ans =

6

min(a)

ans =

1

Eger matris uzerinde islem yapılırsa, bu fonksiyonlar matrisin her birsutununda islem yaparlar ve sonuc olarak bir satır vektoru dondururler

a = [1 2 3; 4 5 6]

a =

1 2 34 5 6

14

Page 15: MATLAB Programlama Notlar‡ - ismailari.comismailari.com/wp-content/.../2008/04/matlabileprogramlamayagiris.pdf · Matlab Programlamaya Giri»s G˜orun˜ tu˜ i»sleme kodlar‡n‡

Her sutunun ortalaması

mean(a)

ans =

2.5000 3.5000 4.5000

Her satırın en yuksek degeri

max(a)

ans =

4 5 6

Matristeki en yuksek deger

max(max(a))

ans =

6

Her satırın ortalaması (ikinci arguman hangi boyutta islem yapilacaginigosterir)

mean(a, 2)

ans =

25

Vektorlerde carpma ve bolme islemlerine gecelim. 1x3 satır vektoru ile 3x1sutun vektoru carpımı sonucu skalar elde ederiz. Nokta carpımı veya ic carpımolarak da bilinir. . kullanmadıgımıza dikkat edin.

[1 2 3] * [4 5 6]’

15

Page 16: MATLAB Programlama Notlar‡ - ismailari.comismailari.com/wp-content/.../2008/04/matlabileprogramlamayagiris.pdf · Matlab Programlamaya Giri»s G˜orun˜ tu˜ i»sleme kodlar‡n‡

ans =

32

3x1 sutun vektoru ile 1x3 satır vektoru carpımı 3x3luk matris olusturur.

[1 2 3]’ * [4 5 6]

ans =

4 5 68 10 12

12 15 18

(C) Matris islemleri:

Iki tane rasgele matris olusturup carpalım. Alttaki ornekte carpım sonucu3x4luk bir matris olusacak.

a = rand(3,2)b = rand(2,4)c = a * b

a =

0.6064 0.48900.8167 0.76070.8301 0.9151

b =

0.9010 0.5471 0.1944 0.47560.2142 0.7847 0.7469 0.5833

c =

0.6511 0.7155 0.4832 0.57360.8988 1.0437 0.7270 0.83210.9439 1.1722 0.8449 0.9285

16

Page 17: MATLAB Programlama Notlar‡ - ismailari.comismailari.com/wp-content/.../2008/04/matlabileprogramlamayagiris.pdf · Matlab Programlamaya Giri»s G˜orun˜ tu˜ i»sleme kodlar‡n‡

Vektor ve matrislerle baska 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 =

266094

Matrisin tersini hesaplayalım.

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

ans =

-0.3333 0.2821 -0.05130.6667 0.1282 -0.2051

-0.3333 -0.3333 0.3333

a’nın ozdegerlerinden olusan vektor

eig(a)

ans =

15.1601-1.68601.5258

17

Page 18: MATLAB Programlama Notlar‡ - ismailari.comismailari.com/wp-content/.../2008/04/matlabileprogramlamayagiris.pdf · Matlab Programlamaya Giri»s G˜orun˜ tu˜ i»sleme kodlar‡n‡

Hesaplamısken ozvektorleri de bulalım. D matrisi kosegende ozvektorleribarındırır; V matrisi ozvektorleri icerir. Bu, MATLAB ile birden cok degiskendondurulmesine de guzel 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 00 -1.6860 00 0 1.5258

a’nın ”singular value decomposition” sonucu. a = U * S * V’, a’nın ”singu-lar” degerleri 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 00 2.0802 00 0 1.1216

V =

-0.5454 -0.8059 0.2302-0.5895 0.1736 -0.7889-0.5959 0.5660 0.5697

18

Page 19: MATLAB Programlama Notlar‡ - ismailari.comismailari.com/wp-content/.../2008/04/matlabileprogramlamayagiris.pdf · Matlab Programlamaya Giri»s G˜orun˜ tu˜ i»sleme kodlar‡n‡

Baska baska da matris fonksiyonları var: det, norm, rank, ...

(D) Matrisleri yeniden sekillendirme ve birlestirme:

Once bir matris olusturalım. Daha sonra onu dogrusal bir vektore cevirelim.

Dikkat: Matrisleri diger dillerdeki (c,c++,vb.) gibi satır satır degil de sutunsutun dusunmek gerekir. a’nın sutunlarını ekleyerek yeni bir sutun vektoruolusturuyoruz.

a = [1 2; 3 4; 5 6];b = a(:)

b =

135246

Tum elemanların toplamını almak isteseydik

sum(a(:))

ans =

21

b vektorunun elemanlarından 2x3luk bir matris olusturalım (yine sutunsutun)

a = reshape(b, 2, 3)

a =

1 5 43 2 6

19

Page 20: MATLAB Programlama Notlar‡ - ismailari.comismailari.com/wp-content/.../2008/04/matlabileprogramlamayagiris.pdf · Matlab Programlamaya Giri»s G˜orun˜ tu˜ i»sleme kodlar‡n‡

Iki tane satır vektorunu yatay olarak birlestirelim. (horzcat’a bakınız.)

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

c =

1 2 3 4

Iki tane sutun vektorunu dikey olarak birlestirelim. (vertcat’a bakınız.)

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

b =

45

c =

12345

Benzer sekilde matrisleri de birlestirebiliriz.

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

a =

1.0000 0 0 0.2605 0.9171 0.76300 1.0000 0 0.0848 0.4705 0.77220 0 1.0000 0.2981 0.2695 0.0213

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

20

Page 21: MATLAB Programlama Notlar‡ - ismailari.comismailari.com/wp-content/.../2008/04/matlabileprogramlamayagiris.pdf · Matlab Programlamaya Giri»s G˜orun˜ tu˜ i»sleme kodlar‡n‡

b =

1 0 00 1 00 0 11 1 1

repmat kullanarak bir degiskeni ızgara seklinde kopyalayabiliriz. Ornegin tumdegerleri 5 olan 3x2lik bir matris yapalım.

b = repmat(5, 3, 2)

b =

5 55 55 5

Illa ki tek deger 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 23 4 3 4

Verilen vektorle 3x3luk bir kosegen matrisi olusturalım.

b = diag([1 2 3])

b =

1 0 00 2 00 0 3

21

Page 22: MATLAB Programlama Notlar‡ - ismailari.comismailari.com/wp-content/.../2008/04/matlabileprogramlamayagiris.pdf · Matlab Programlamaya Giri»s G˜orun˜ tu˜ i»sleme kodlar‡n‡

Kontrol Islemleri ve Vektorleme (Vectorization)

Donguleri en azından bir dilde bildiginizi bilerek hızlıca MATLAB’de nasılolduguna bakalım.

Kontrol islemlerinin sentaksı:

for DEGISKEN = DEGERLERislem...

islemend

DEGERLER dongunun hangi degerler icin yapılacagı vektor olmalıdır, ornegin:1:10 veya -1:0.5:1 veya [1 4 7]

while KOSULislemLER

end

if KOSULislemLER

elseif KOSULislemLER

elseislemLER

end

elseif ve else kısımları istege baglıdır, end ise gereklidir.

KOSUL|lar genellikle iliskilerden olusur, ornegin |a < b

Operatorler: , <, >, <=, >=, ==, = (C’deki ! yerine ˜ kullanılır)KOSUL|lar |&& (ve), || (veya) ile kullanılabilir. Or. a < b && ( c != d \\|e >= f)|

Uyarı:

Donguler MATLAB’de cok yavas calısır. Islemlerinizi hızlandırmak icinmumkun olan yerlerde vektorleme yapmalısınız. Or: Kodunuzu matrisislemleriyle tekrar yazmalısınız. Asagıda birkac ornek bulacaksınız.

1’den 7’ye kadar 2 atlayarak dongu olusturalım ve i’yi ekrana basalım.

for i=1:2:7i

end

22

Page 23: MATLAB Programlama Notlar‡ - ismailari.comismailari.com/wp-content/.../2008/04/matlabileprogramlamayagiris.pdf · Matlab Programlamaya Giri»s G˜orun˜ tu˜ i»sleme kodlar‡n‡

i =

1

i =

3

i =

5

i =

7

Verilen bir vektor ustunde dongu olusturalım. Icine bir de if kontrolukoyalım.

for i=[5 13 -1]if (i > 10)

disp([int2str(i) ’ sayısı 10dan buyuk’])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ında13 sayısı 10dan buyuk-1 sayısı negatif bir sayı

Baska bir ornek: A adında mxn’lik bir matris ve v adında 1xnlik bir vektorverilmis olsun, v’yi A’nın her satırından cıkarmak istiyoruz.

m = 6; n = 3;A = ones(m, n)v = 2 * rand(1, n)

23

Page 24: MATLAB Programlama Notlar‡ - ismailari.comismailari.com/wp-content/.../2008/04/matlabileprogramlamayagiris.pdf · Matlab Programlamaya Giri»s G˜orun˜ tu˜ i»sleme kodlar‡n‡

A =

1 1 11 1 11 1 11 1 11 1 11 1 1

v =

1.7600 1.5963 0.6483

Dongu kullanarak soyle yapabiliriz

for i=1:mA(i,:) = A(i,:) - v;

end

Aynı islemi yalnızca matris islemleri 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 (ozellikle bu isleme cok kez ihtiyaciniz varsa) isinizi hızlandıracaktır!!!

Donguler kosullu islemler icerse dahi vektorleme yapabiliriz

Ornek: mxn’lik A matrisi verilsin, aynı boyutta tum degerleri sıfır olan birB matrisi olusturalım. Daha sonra B’ye, A’nın sıfırdan buyuk olan elemanlarınıkopyalayalım.

Dongu kullanarak hesaplama:

24

Page 25: MATLAB Programlama Notlar‡ - ismailari.comismailari.com/wp-content/.../2008/04/matlabileprogramlamayagiris.pdf · Matlab Programlamaya Giri»s G˜orun˜ tu˜ i»sleme kodlar‡n‡

B = zeros(m,n);for i=1:m

for j=1:nif A(i,j)>0B(i,j) = A(i,j);

endend

endB

B =

0 0 0.35170 0 0.35170 0 0.35170 0 0.35170 0 0.35170 0 0.3517

Tum bu islemler hic dongu kullanmadan yapılabilir! A’nın 0’dan buyuk 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 10 0 10 0 10 0 10 0 10 0 1

B(ind) = A(ind)

B =

0 0 0.35170 0 0.35170 0 0.3517

25

Page 26: MATLAB Programlama Notlar‡ - ismailari.comismailari.com/wp-content/.../2008/04/matlabileprogramlamayagiris.pdf · Matlab Programlamaya Giri»s G˜orun˜ tu˜ i»sleme kodlar‡n‡

0 0 0.35170 0 0.35170 0 0.3517

Degiskenleri/Oturumu Kaydetmek

Bugun oturduk, calıstık... Yorulduk, aynı degiskenlerle sonradan calısalımdedik...

Alttaki kullanım tum calısma alanı degiskenlerini dosyam.mat dosyasına kayd-eder. Bulundugunuz klasore bir goz atın, dosya orada duruyor mu bakalım?

save dosyam

Sadece a ve b degiskenlerini kaydetmek isteseydik:

save dosyam a b

Peki bu iki degiskeni kaydetmek degil de silmek isteseydik:

clear a b

Tum degiskenleri silelim:

clear

Kaydettigimiz degiskenleri geri yukleyelim

load dosyam

m-dosyaları ile Betikler ve Fonksiyonlar Yazma:

MATLAB ile betik dosyası olusturma

MATLAB betikleri ”.m” uzantısı olan ve MATLAB kodları iceren dosyalardır.Dosya icindeki degiskenler global calısırlar ve o anki MATLAB oturumundaortamda bulunan aynı isimdeki degiskenleri degistirir. ”betigim.m” adındakibir betigi ”betigim” yazarak komut satırından calıstırabilirsiniz.

Mesela alttaki kodu betigim.m olarak kaydedin.

a = 10;b = 2*a;

26

Page 27: MATLAB Programlama Notlar‡ - ismailari.comismailari.com/wp-content/.../2008/04/matlabileprogramlamayagiris.pdf · Matlab Programlamaya Giri»s G˜orun˜ tu˜ i»sleme kodlar‡n‡

Simdi de komut satırından sunları girelim

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

a =

10

b

b =

20

Goruldugu uzere tanımladıgımız degiskenler betik icinde yeni degerlereatandı. Bu tehlikeli olabilir. Gelin fonksiyon yazmaya gecelim.

MATLAB ile fonksiyon yazma

Fonksiyonlar da m-dosyalarıdır. Farklı olarak bir fonksiyonun ilk satırı soyleolmalıdır:

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

Fonksiyonun adı dosya adı ile aynı olmalıdır. Ornegin ”fonksiyonum” fonksiy-onu ”fonksiyonum.m” dosyasına koyulmalıdır. Ornek olarak fonksiyonum.m vedigerfonksiyonum.m dosyalarına bakiniz.

Fonksiyonlar lokal ortamda calıstırırlar. Yani ana calısma alanındaki aynıisimdeki bir degiskeni kaybetme riskiniz yoktur. Fonksiyonun sonucunda sadecesonuc olarak donen deuiskenler, cagıran fonksiyonun calısma alanında gorulur.

Ornekleri yapmadan once asagıdaki fonksiyonları calısma dizininize kaydedin.

fonksiyonum.m: Tek girdi argumanı alan ve tek deger donduren ornekfonksiyon

27

Page 28: MATLAB Programlama Notlar‡ - ismailari.comismailari.com/wp-content/.../2008/04/matlabileprogramlamayagiris.pdf · Matlab Programlamaya Giri»s G˜orun˜ tu˜ i»sleme kodlar‡n‡

function y = fonksiyonum(x)

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

digerfonksiyonum.m: 2 girdi argumanı alan ve 2 deger donduren ornekfonksiyon

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

Goruldugu uzere a degeri degismedi. Simdi de iki degisken dondurenornegimizi cagıralım

[c, d] = digerfonksiyonum(a, b)

c =

1 5 9 13

d =

1 -1 -3 -5

28

Page 29: MATLAB Programlama Notlar‡ - ismailari.comismailari.com/wp-content/.../2008/04/matlabileprogramlamayagiris.pdf · Matlab Programlamaya Giri»s G˜orun˜ tu˜ i»sleme kodlar‡n‡

Grafik Cizdirme

Belki MATLAB’in en guclu yanı cizebildigi cesitli guzel grafiklerdir. Once temelcizim fonksiyonumuz plot ile baslayalım.

y = [0 1 5 2 3];

y’yi indeks degerleri ile grafik olarak cizelim. Yani dikey eksen y’nin degerleriolsun, yatay eksense 1’den baslayıp y’nin boyuna kadar gitsin.

plot(y)

1 1.5 2 2.5 3 3.5 4 4.5 50

0.5

1

1.5

2

2.5

3

3.5

4

4.5

5

Istersek yatay eksen degerlerini de verebiliriz. Ustune axis ile goruntulenensınırları belirleyebiliriz. Kullanımı: axis([enkucukx enbuyukx enkucukyenbuyuky])

x = linspace(0,1,length(y));plot(x, y);axis([-0.5 1.5 -0.2 5.2]);

29

Page 30: MATLAB Programlama Notlar‡ - ismailari.comismailari.com/wp-content/.../2008/04/matlabileprogramlamayagiris.pdf · Matlab Programlamaya Giri»s G˜orun˜ tu˜ i»sleme kodlar‡n‡

−0.5 0 0.5 1 1.5

0

0.5

1

1.5

2

2.5

3

3.5

4

4.5

5

Normalde yeni bir figur cizdigimizde en son aktif olan figurun ustune cizilir.Eger yeni bir figur acmak istersek figure yazabiliriz. Simdi de bir sinus grafigicizelim ve biraz da susleyelim.

figurex = pi*[-24:24]/24;plot(x, sin(x))xlabel(’radyan’)ylabel(’sinus degeri’)title(’Sinus Grafigi’)

30

Page 31: MATLAB Programlama Notlar‡ - ismailari.comismailari.com/wp-content/.../2008/04/matlabileprogramlamayagiris.pdf · Matlab Programlamaya Giri»s G˜orun˜ tu˜ i»sleme kodlar‡n‡

−4 −3 −2 −1 0 1 2 3 4−1

−0.8

−0.6

−0.4

−0.2

0

0.2

0.4

0.6

0.8

1

radyan

sinü

s de

ðeri

Sinüs Grafiði

Bazen aynı figure bir cizim yapmak yerine kucuk pencereler halindedaha cok cizim yapmak isteyebiliriz. Bunun icin de subplot im-dadımıza yetisiyor. Kullanım: subplot(satir sayisi, sutun sayisi,su an cizilecek olanin indeksi)

subplot(1, 2, 1)plot(x, sin(x))axis squaretitle(’Sin grafigi’)

subplot(1, 2, 2);plot(x, cos(x));axis squaretitle(’Cos grafigi’)

−4 −2 0 2 4−1

−0.5

0

0.5

1Sin grafiði

−4 −2 0 2 4−1

−0.5

0

0.5

1Cos grafiði

31

Page 32: MATLAB Programlama Notlar‡ - ismailari.comismailari.com/wp-content/.../2008/04/matlabileprogramlamayagiris.pdf · Matlab Programlamaya Giri»s G˜orun˜ tu˜ i»sleme kodlar‡n‡

Yukarıda goruntulenen alanları kare yaptık. Baska secenekler de koyabilirdik.help axis ile gorebilirsiniz.

Simdi de aynı cizim alanına birden fazla cizim yapalım. Bunun icinhold on ve hold off kullanmamız gerekecek. Bu komutlarla yeni cizimyapılırken eski cizimin ustune yapılıp yapılmayacagı belirlenir. Istersekplot(x1,y1,x2,y2,x3,y3,...) seklinde de birden cok cizim yapabilirdik.Fakat boyle tercih etmemin sebebi cizimlerin ozelliklerini ayrı ayrı belirleye-bilmek.

Alttaki ornekte ’:’ parametresi kesik cizgili dogru cizer. help plot ile dogruve nokta sekillerine bakabilirsiniz. Pek cok guzel secenek mevcut. legend ile decizimlerin adlarını koyabiliriz.

figureplot(x, sin(x), ’-g’);hold onplot(x, cos(x), ’--r’)legend(’sin’, ’cos’)hold off

−4 −3 −2 −1 0 1 2 3 4−1

−0.8

−0.6

−0.4

−0.2

0

0.2

0.4

0.6

0.8

1

sincos

Bundan sonra tekrar cizim yapan fonksiyonlardan herhangi birini (plot, stem,bar, stairs, vb.) cagırırsanız eski cizim silinir ve sadece yeni cizim gozukur.Haydi ornek olarak stem fonksiyonu cizelim, biraz da varyete ekleyelim.

stem(x,sin(x), ’--ro’,’LineWidth’,2,...’MarkerEdgeColor’,’k’,...

32

Page 33: MATLAB Programlama Notlar‡ - ismailari.comismailari.com/wp-content/.../2008/04/matlabileprogramlamayagiris.pdf · Matlab Programlamaya Giri»s G˜orun˜ tu˜ i»sleme kodlar‡n‡

’MarkerFaceColor’,’g’,...’MarkerSize’,7)

title(’Sin grafigi’)

−4 −3 −2 −1 0 1 2 3 4−1

−0.8

−0.6

−0.4

−0.2

0

0.2

0.4

0.6

0.8

1Sin grafiði

Matrisleri resim gibi cizmeye bakalım.

m = rand(16,16);imagesc(m)

33

Page 34: MATLAB Programlama Notlar‡ - ismailari.comismailari.com/wp-content/.../2008/04/matlabileprogramlamayagiris.pdf · Matlab Programlamaya Giri»s G˜orun˜ tu˜ i»sleme kodlar‡n‡

2 4 6 8 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 gorunecek sekilde sabitleyelim.

colormap grayaxis imageaxis off

34

Page 35: MATLAB Programlama Notlar‡ - ismailari.comismailari.com/wp-content/.../2008/04/matlabileprogramlamayagiris.pdf · Matlab Programlamaya Giri»s G˜orun˜ tu˜ i»sleme kodlar‡n‡

Isimiz bitti, tum figurleri kapatalım. Not: Sadece close kullansaydık su ankifiguru kapatırdık.

close all

Ipucu: Eger dongulerin icinde plot fonksiyonunu (veya diger cizim fonksiy-onlarını) cagırırsanız her dongudeki sonuc yerine son sonucu gorebilirsiniz. Tumcizim sonuclarını animasyon seklinde gormek icin plot fonksiyonundan sonradongu icine drawnow komutunu giriniz.

Karmasık Sayılarla Islemler

MATLAB’de gercel sayılar dısında karmasık sayılarla da islem yapılabilir.Karmasık sayılar icin ”complex” veri tipi vardır. Karmasık sayıları tanımlarkensanal degerleri icin i veya j kullanılabilir. Daha onceden i veya j’yibaska degerlere atadıysanız (ornegin bir dongude sayac olarak) sanal birimolarak kullanamazsınız. i ve j olarak ayrı ayrı olması muhendislerin j,fizikcilerin/matematikcilerin i kullanmasıdır.

Biz her ihtimale karsı onceden tanımlanan i ve j degerlerini silelim ki sanalbirim icin guvenle kullanabilelim.

35

Page 36: MATLAB Programlama Notlar‡ - ismailari.comismailari.com/wp-content/.../2008/04/matlabileprogramlamayagiris.pdf · Matlab Programlamaya Giri»s G˜orun˜ tu˜ i»sleme kodlar‡n‡

clear i j

i

i =

6

j

j =

3

Degisik karmasık sayılar olusturalım

x = 1 + 4i

x =

1.0000 + 4.0000i

x = real(x) + imag(x)*i

x =

25

theta = pi/4y = cos(theta) + sin(theta)*j

theta =

0.7854

y =

2.8284

36

Page 37: MATLAB Programlama Notlar‡ - ismailari.comismailari.com/wp-content/.../2008/04/matlabileprogramlamayagiris.pdf · Matlab Programlamaya Giri»s G˜orun˜ tu˜ i»sleme kodlar‡n‡

Yukarıdaki ornegi, Euler formulunu kullanarak da hesaplayalım, bakalım aynımı?

y = exp(i*theta)

y =

111.3178

Skalar degerler gibi, vektor ve matrisleri olusturmak da mumkun:

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.0700i0.1000 0.0300 - 0.0800i -0.0200 - 0.0200i

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

B =

3.9253 2.1550 4.97173.1600 0.9662 1.8957

Simdi transpoze ve eslenik transpozeyi tekrardan hatırlayalım. Sadece tektırnak koyarsak, bu elemanların eslenigini de alır. Eslenik almadan transpozeyapmak istersek .’ kullanmalıyız.

37

Page 38: MATLAB Programlama Notlar‡ - ismailari.comismailari.com/wp-content/.../2008/04/matlabileprogramlamayagiris.pdf · Matlab Programlamaya Giri»s G˜orun˜ tu˜ i»sleme kodlar‡n‡

C1 = B’

C1 =

3.9253 3.16002.1550 0.96624.9717 1.8957

C2 = B.’

C2 =

3.9253 3.16002.1550 0.96624.9717 1.8957

Gercel sayılardaki tum islemler karmasık sayılarla da yapılabilir. Ornegintoplama, cıkarma, matris carpımı, eleman eleman carpım, fonksiyonlar, vb.

A + B

ans =

1.0e+002 *

0.2893 1.1347 0.0997 - 0.0700i0.1316 0.0397 - 0.0800i -0.0010 - 0.0200i

A - B

ans =

1.0e+002 *

0.2107 1.0916 0.0003 - 0.0700i0.0684 0.0203 - 0.0800i -0.0390 - 0.0200i

A * A’

38

Page 39: MATLAB Programlama Notlar‡ - ismailari.comismailari.com/wp-content/.../2008/04/matlabileprogramlamayagiris.pdf · Matlab Programlamaya Giri»s G˜orun˜ tu˜ i»sleme kodlar‡n‡

ans =

1.0e+004 *

1.3091 0.0588 + 0.0915i0.0588 - 0.0915i 0.0181

A .* B

ans =

1.0e+002 *

0.9813 2.3989 0.2486 - 0.3480i0.3160 0.0290 - 0.0773i -0.0379 - 0.0379i

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

ans =

210.7658

mean(B(:))

ans =

2.8456

Gercel degerli degiskenler ile karmasık degerli degiskenlerin sonucu karmasıkdegerlidir.

Bazı fonksiyonlar karmasık degerler dondurebilir. Ornegin hızlı Fourierdonusumu karmasık sayılar dondurur.

x = rand(8,1)

39

Page 40: MATLAB Programlama Notlar‡ - ismailari.comismailari.com/wp-content/.../2008/04/matlabileprogramlamayagiris.pdf · Matlab Programlamaya Giri»s G˜orun˜ tu˜ i»sleme kodlar‡n‡

x =

0.28040.25940.54710.54130.78810.86960.78750.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 baslangıc icin bu kadar yeterli! Takıldıgınız yerde MATLAB’inyardımını kullanabilirsiniz.

Artık rahatca resimleri matris seklinde okuma ve uzerinde islem yapma konu-larına gecebiliriz. Bir dahaki yazıda kaldıgımız yerden devam edelim...

http://www.cs.brown.edu/courses/cs143/MatlabTutorialCode.html’den yolacıkarak yeni bircok ekleme ile Turkce’ye uyarlanmıstır.

Ismail Arı Son degistirilme: 01.04.2008

40