Avlusning

Det finns en sk avlusare (debugger) i Matlab men man brukar klara sig med enklare tekniker. Här några tips.

Man kan skriva ut variablers värden. Säg att man får ett fel på raden:

r = A * b - x;

Man kan då förvissa sig om att variablerna är definierade, har rätt storlek, innehåller rimliga värden etc. genom att skriva ur variablernas värden.

A, b, x         % skriv ut värdena
r = A * b - x;

Om r beräknas och man vill se värdet avlägsnar man bara ; sist på raden. Denna teknik fungerar även i funktioner. Om man kör scriptfiler behöver man kanske inte lägga utskriftsraden i filen, utan man kan ge utskriftskommandot direkt i Matlab.

Om man har stora datamängder vill man kanske inte skriva ut allt. Om Matlab klagar på att matris/vektor-storlekar inte passar ihop kan man skriva ut dimensionerna, size(A), t.ex. Om variabler inte är lokala till funktioner kan man ge kommandot whos.

I bland undrar man om en loop eller if-sats exekveras. Man kan då lägga in en utskrift, t.ex. så här:

for k = 1:n
  k                 % skriv ut loopindex k
  if a(k) * b(k) > 0
    disp('if')      % disp ger en utskrift
    c(k + 3) = a(k) - 3;
  else
    disp('else')
    c(k + 3) = a(k+1) - 4;
  end
end

Om man får fel i ett komplicerat uttryck kan man försöka att exekvera delar av det (klipp och klistra). Man bör också kontrollera att man satt ut parenteser korrekt. Det är t.ex. skillnad på a = (1:10)'; och a = 1:10'; . Man skall inte sätt ut för många parenteser heller, koden blir då oläslig. Helst skall man bara sätta ut nödvändiga parenteser.

I en Z-lab skall man skicka en egen funktion, func säg, som parameter till en Matlab-funktion (ode45, t.e.x). Man kan då testa sin egen funktion genom att anropa den på lämpligt sätt, så att man ser att den returnerar ett rimligt resultat. Skickar man en felaktig funktion som parameter kan man få rätt komplicerade felmeddelanden.

Matlab har inte reserverade funktionsnamn. Man kan t.ex. skriva sin = 2; men sinusfunktionen är då dold och sin(1.22) kommer inte att fungera. Om man undrar vilken typ sin har kan man skriva which sin (generellt which variabelnamn). Här är ett exempel:

>> which sin
built-in   % double method
>> sin(1.22)
ans =
    0.9391

>> sin = 2;   % använd sin som variabel
>> sin(1.22)
??? Subscript indices must either be real positive integers or logicals.

>> which sin
sin is a variable.

>> clear sin  % ta bort variabeln sin
>> sin(1.22)  % sinusfunktionen igen
ans =
    0.9391

Back