Upload
phamkien
View
250
Download
1
Embed Size (px)
Citation preview
MATLAB Programlama Notları
v 0.1
Ismail Arı
1 Nisan 2008
1
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
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
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
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
(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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
−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
−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
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
’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
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
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
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
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
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
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
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