Programmering

Följande sida handlar om for-, if-, while-satser etc. Man har mindre behov av sådana konstruktioner i Matlab än i t.ex. Java, eftersom man kan byta ut looparna mot vektor- och matrisoperationer. Att lära sig tänka på vektor/matris-nivå är inte så enkelt och tar tid. Fördelarna är många: snabbare kod, färre rader och enklare att läsa och förstå (för en person som är van vid matrisberäkningar). Här följer några enkla enkla exempel.

Två enkla summationsloopar:

>> s = 0;
>> for k = 1:10
     s = s + k;
   end
>> s
s =
    55

>> s1 = 0;
>> for k = 10:-1:1  % räkna baklänges, OBS steget -1
     s1 = s1 + k;
   end
>> s1
s1 =
    55

Att hitta största elementet i en vektor.

>> v = randn(10, 1);    % lite data
>> max_v = v(1);
>> for k = 2:length(v)  % gå igenom de resterande elementen
     if v(k) > max_v    % större?
       max_v = v(k);
     end                % end if
   end                  % end for

>> max_v
max_v =
   2.1832e+00

>> max(v)               % använd Matlabs inbyggda max-rutin
ans =
   2.1832e+00

for-satsen kan mer än vad som framgår av exemplet ovan. Man kan skriva for k = matris ... varvid loopvariabeln, k,  kommer att anta kolonnerna i matriserna i tur och ordning. I följande exempel beräkna vi de maximala elementen i respektive kolonn.

>> M = magic(5);   % lite data
>> max_M = [];     % spara max-värdena i vektorn max_M, initiera till tomma vektorn
>> for kol = M     % för varje kolonn i M
     max_M = [max_M, max(kol)];  % lägg till max-värdet i vektorn
   end
>> max_M           % skriv ut
max_M =
    23    24    25    21    22

>> max(M)          % Matlabs max-rutin gör detta åt oss (den arbetar kolonnvis)
ans =
    23    24    25    21    22

Ett annat sätt att skriva ovanstående for-loop är:

>> for k = 1:size(M, 2)              % k = 1, 2, ..., antalet kolonner
     max_M = [max_M, max(M(:, k))];  % M(:, k) = kolonn nummer k
   end

Det är vanligt att Matlabs rutiner arbetar kolonnvis. sum(M) bildar kolonnsummorna och sort(M) ger en matris med sorterade kolonner, till exempel. Vill ha man ha radsummor får man ange den dimension som sum skall summera utmed, sum(M, 2). Detta gäller dock inte vektorer. sum(v), där v är en vektor, ger summan av elementen oavsett om v är en rad- eller kolonnvektor.

Man kan givetvis ha nästade loopar (loopar i loopar). Följande rader beräknar det största elementet i matrisen:
>> max_M = M(1, 1);
>> for j = 1:size(M, 1)
     for k = 1:size(M, 2)
       if M(j, k) > max_M
         max_M = M(j, k);
       end
     end
   end
>> max_M
max_M =
    25

>> max(M(:))  % kortare, M(:) är en kolonnvektor med kolonnerna staplade på varandra
ans =
    25

>> max(max(M))  % ett annat alternativ
ans =
    25

Följande exempel visar hur while-loopen kan användas. Hur stort måste n vara för att 1 + 1/2 + 1/3 + ... + 1/n > 10? Den harmoniska serien är ju divergent så vi vet att det existerar n så att summan är större än 10.

>> s = 0;   % partialsumman
>> k = 0;   % "loop-index"
>> while s <= 10
     k = k + 1;
     s = s + 1 / k;
   end

>> k
k =
       12367

>> format long e
>> s
s =
     1.000004300827578e+01

Det finns givetvis allmännare former av if-satser. if-else och if-elseif-varianter. Här två exempel:

>> a = 10;
>> if a > 100
     disp('större')  % utskrift
   else
     disp('mindre')
   end
mindre  % resultatet

>> if a < 5
     b = 1;
   elseif a < 8
     b = 2;
   elseif a < 12
     b = 3;
   else
     b = 4;
   end

>> b
b =
     3

Back