[Bölüm 9] MATLAB’ta Tekrarlanan Yapılar (Döngüler)

Merhaba arkadaşlar, bu yazımda sizlere MATLAB üzerinde algoritma yazarken oluşturulan döngülerden bahsedeceğim.

  • for – end yapısı ile MATLAB‘ta döngü oluşturulur. for ile end arasında yazan kavramlar for komutundan sonra tanımlanan matrisin eleman sayısı kadar tekrarlanır.
for k = [1 2 3]
    k
end

k =
   1
k =
   2
k =
   3

 

for k = [1:3]
    a(k) = k^2
end

a =
   1
a =
   1   4
a =
   1   4   9

 

for k = [1:3]
    a = 5^k
end

a =
   5
a =
   25
a =
   125
  • for komutundan sonra iki veya daha fazla boyutlu bir matris tanımlandığı zaman MATLAB sütunları baz alır ve öyle işlem yapar.
for k = [1,2,3; 1,4,9 ; 1,8,27]
a = k'
end

a =
   1  1  1
a =
   2  4  8
a =
   3  9  27
  • while kriter yapısı ile oluşturulan döngüler belirli bir kriter üzerine kurulur.
k=0;
while k < 3
    k = k + 1
end

k =
   1
k =
   2
k =
   3


k = 0;
while k < 3
    k = k + 1
    a(k) = 5^k
end

a =
    5
a =
    5   25
a =
    2   25   125
  • Aşağıdaki örnekten rahatlıkla anlaşılabileceği gibi 2. işlem yapılırken 1. işlemin sonucu referans alınır, 3. işlem yapılırken 2. işlemin sonucu referans alınır.
a = 0;
while a < 10
    a = a + 3
end
a =
   3
a =
   6
a =
   9
a =
   12
  • if komutu while komutu ile aşağıdaki gibi kullanılır.
scores=[76,45,98,97];
count = 0;
k =0;
while k<length(scores) k = k + 1;
    if scores(k) > 90
        count = count + 1
    end
end

count =
       1
count =
       2
  • while komutu aynı zamanda koşullu hata kontrolünde kullanılır.
x = input('Enter a positive value of x')
while (x<=0)
    disp('log(x) is not defined for negative numbers')
    x = input('Enter a positive value of x')
end

y = log10(x);
fprintf('The log base 10 of %4.2f is %5.2f \n',x,y)
Enter a positive value of x0

x =
   0

log(x) is not defined for negative numbers
Enter a positive value of x5

x =
   5

The log base 10 of 5.00 is 0.70
  • break komutu komutların işlevini durdurur.
n = 0;
while(n < 10)
    n = n+1;
    a = input('0 dan büyük bir değer giriniz: \n');
    if(a <= 0)
        disp('pozitif bir sayı girmelisiniz')
        disp('bu program sonlanacak')
        break
    end
    disp('bu sayının doğal logaritması:')
    disp(log(a))
end


0 dan büyük bir değer giriniz:
5
bu sayının doğal logaritması:
   1.6094

0 dan büyük bir değer giriniz:
-1
pozitif bir sayı girmelisiniz
bu program sonlanacak
  • continue komutu break komutuna nispeten komutun bir sonraki komuta devam etmesine olanak sağlar.
n = 0;
while(n <10)
    n = n+1;
    a = input('0 dan büyük bir değer giriniz: \n');
    if(a <= 0)
        disp('pozitif bir sayı girmelisiniz')
        disp('bu program sonlanacak')
        continue
    end
    disp('bu sayının doğal logaritması:')
    disp(log(a))
end


0 dan büyük bir değer giriniz:
-5

pozitif bir sayı girmelisiniz
bu program sonlanacak


0 dan büyük bir değer giriniz:
5
bu sayının doğal logaritması:
   1.6094

0 dan büyük bir değer giriniz:

NOT: break komutu uygulandığı zaman kapsadığı komut girildikten sonra işlemleri bitirir devamını getirmez lakin continue komutu ile yazılan komutlarda koşul sağlansa da sağlanmasa da bir sonraki komuta geçilir.

  • while(1) komutu ile sonsuz döngü oluşturulabilir.
while(1)
    seker_kamisi_sayisi = input('şeker kamışı sayısını giriniz\n ');
    if seker_kamisi_sayisi < 0
        disp('pozitif bir sayı girmelisiniz')
    else
        toplam = seker_kamisi_sayisi *.75;
        fprintf('toplam maliyet %5.2f türk lirası \n' , toplam)
        break
    end
end

NOT: while komutuyla döngü oluşturulduğunda yazılan komuta göre döngü sonsuza kadar gidiyor. Bir önceki örnekte ise negatif sayı girmeye devam edildiği sürece döngü sonsuza kadar devam ediyor. Bu sorunu halledebilmek için döngü for komutu ile oluşturulabilir. for komutundan sonra tanımlanan matrisin eleman sayısı kadar döngü tekrar eder ve sonrasında kendisini sonlandırır.

for k=1:3
    seker_kamisi_sayisi= input('şeker kamışı sayısını giriniz \n');
    if seker_kamisi_sayisi < 0
        disp('pozitif bir sayı girmelisiniz')
    else
        toplam = seker_kamisi_sayisi *.75;
        fprintf('toplam maliyet %5.2f türl lirası \n',toplam)
        break
    end
end


şeker kamışı sayısını giriniz
-3
pozitif bir sayı girmelisiniz

şeker kamışı sayısını giriniz
-2
pozitif bir sayı girmelisiniz

şeker kamışı sayısını giriniz
-5
pozitif bir sayı girmelisiniz
  • for komutu kullanılarak döngü içerisinde döngü yapılabilir.
x=[1  2  6  3;
   4  8  2  1;
   12 18 3  5;
   6  4  2  13];
[rows,cols] = size(x);
for k = 1:cols
    maximum(k) = x(1,k)
    for j = 1:rows
        if x(j,k) > maximum(k)
            maximum(k) = x(j,k);
        end
    end
end


maximum =
        1   18  6  13
maximum =
        12  2   6  13
maximum =
        12  18  6  13
maximum =
        12  18  6  3
  • etime(tic,toc) komutu tic – toc zaman aralığında geçen süreyi hesaplar.

ÖRNEK 1:

A = ones(200);
t0 = clock;
for k = 1:length(A(:))
    B(k) = A(k)*pi;
end
time = etime(clock, t0)


time =
      69.6200

ÖRNEK 2:

A = ones(200);
t0 = clock;
%Create a B matrix of ones

B = A;
for k = 1:length(A(:))
    B(k) = A(k)*pi;
    end
time = etime(clock, t0)


time =
      0.0200

ÖRNEK 3:

A = ones(200);
tic
B = A;
for k = 1:length(A(:))
    B(k) = A(k)*pi;
end
toc
Elapsed time is 0.140000 seconds.

NOT: Elapsed time : Geçen zaman
NOT: Ctrl C ile programın yürütülmesi durdurulabilir.