Beräkningsvetenskap föreläsning 2 19/01 2010 - Per Wahlund if-satser if x > 0 y = 2 + log(x); else y = -1 If-satsen skall alltid ha ett villkor, samt en då det som skall hända är skrivet. Mellan dessa kan det finnas en else-sats som specifierar andra förhållanden. Det Behövs ej parenteser kring villkor och ej heller klamrar runt uttrycket.! Villkoret "skilt från" skrivs inte som i java!= utan ~=. "Icke" skrivs ~. Annars är alla logiska operatorer samma som i java och andra språk. De logiska boolean-värdena lagras som 1 eller 0, inte true eller false. p = (x > 0); Här skulle ett booleanskt värde lagras, i MATLAB blir detta alltså 0 eller 1 istället.
Upprepningssatser While-satser while [[villkor]] [[sats]] [[sats]] Satserna upprepas så länge villkoret är sant, villkoret testas i början av varje loop. Denna fungerar alltså precis på samma sätt som i Java. Det kan bli många "" i slutet, precis som det kan bli många klamrar i slutet vid Java. Ett bra sätt att skriva kan vara att göra tabbar i början av varje rad för att visa vilken "nivå" det gäller. For-looper Används ofta när man vet hur många gånger en sak skall utföras. While-satser kan användas i det sammanhanget också, men en for-loop är bättre. Kan exempelvis användas för att skriva en tabell över talen 1 till 100 och kvadraterna till dessa tal. for k=1:100 disp([k k^2]) I MATLAB finns inte operatorn ++, i en for-loop adderar således MATLAB alltid ett om inget annat anges. Variabeln k existerar även utanför for-loopen. Även om man inom for-loopen sätter k till ett fix värde, exempelvis 17 kommer MATLAB ignorera detta när den kommer upp till starten av loopen igen, den vet redan innan vilket nästa värde i loopen skall vara. Man kan även ta andra steg for k=1:2:99 % Här kommer k att anta värdena 1, 3, 5,... Även negativa steg går bra for k=100:-1:1 % Antar 100, 99, 98,... I MATLAB går det alldeles utmärkt att använda flyttal (float), detta kanske dock inte är så användbart for x=0:0.1:1 Vid for-loopar finns det en liten marginal som täcker upp små små avrundnignsfel på bitnivå. Detta finns dock inte i while-satser, så det är rekommerat att använda sig av heltal i både i for-loopar och while-satser.
Arrayer (vektorer, matriser) I Java är det en sorts objekt som man måste deklarera typ och storlek innan den används. Detta behövs INTE i MATLAB. Dessa uppstår - liksom andra variabler - vid tilldelning. Om man exempelvis vill ha en imensionell array med tre element skulle detta skrivas x(1) = 2.5; x(2) = 1.4; x(3) = -1; Detta har nu skapat arrayen x [ 2.5 1.4-1 ]. Lägsta index för en array i MATLAB är 1, inte 0 som i många andra programmeringsspråk. Index skrivs inom parenteser efter arraynamnet. Om man skriver 0, negativt eller float som index för en array så kommer MATLAB visa ett felmeddelande. Längden på arrayen är vad den är för tillfället, man kan alltid tilldela nya index i arrayen. x(100) = 2; MATLAB fyller upp alla platser mellan det tidigare högsta indexet till det nyligen tilldelade med nollor. Om man på detta sätt förlänger en array godtyckligt kommer det krävas en relativt stor mängd minne som behöver lokaliseras.! Man kan bara använda existerande element i högerledet då man använder dem för att tilldela ett värde till en annan variabel. Matrisen ovan kan tilldelas på ett annat, enklare sätt x = [2.5 1.4-1]; Detta skapar en radvektor, man kan även skapa en kolonnvektor x = [2.5; 1.4; -1]; För att transponera en array skriver man en apostrof efter variabeln x = x' Tvådimensionell array a(1,1) = 2; a(1,2) = 1; a(2,1) = -3; a(2,2) = 5; Bildar den kvadratiska matrisen 2 1-3 5 En tvådimensionell är alltid kvadratisk, MATLAB fyller icke tilldelade platser i en icke kvadratiskt matris med nollor så att en kvadratisk matris bildas.
På samma sätt som ovan kan man tilldela en flerdimensionell matris på ett enklare sätt a = [2 1; -3 5]; Stora arrayer bör skapas med en funktion x = zeros(1,10000); y = ones(1,10000); a = zeros(1000,1000); a = eye(1000,1000); % 1x10000 % 1x10000 % 1000x1000 % 1000x1000 enhetsmatris Arrayoperationer A och B är n*n-arrayer x och y är n*1-arrayer (kolonnvektorer) z = A * x; % matris-vektor-multiplikation, z kommer att bli en kolonnvektor (n*n * n*1 = n*1) C = A * B; n*n-matris w = x * y; % matrismultiplikation, z kommer att bli en ny % detta är FÖRBJUDET, fel storlekar MATLAB kan användas för att lösa ekvationssystem Ax = b. Detta ekvationssystem har formellt lösningen x = A^-1b. x = A \ b; \ används istället för / för att division med en vektor anses vara multiplikation med invers, men samtidigt måste matrisen A vara till vänster. Elementvisa operationer För att addera två arrayer till varandra elementvis kan man skriva z = x + y; som motsvarar for k = 1:n z(k) = x(k) + y(k); Naturligtvis går även subtraktion att utföra. Om man däremot vill multiplicera varje element i en array med motsvarande element i en annan array används andra operatorer. z = x.* y;
som på liknande sätt motsvarar for k = 1:n z(k) = x(k) * y(k); De andra operatorerna är z = x./ y; z = x.^ y; Standardfuktionerna fungerar elementvis, man kan exempelvis ta sinusvärdet för varje element i en vektor. w = sin(x); w = sin(x) + 3 * sqrt(1./ y); Här måste y och x vara lika stora vektorer. Alla operationer utförs elementvis. Delarrayer Antag att x och y är n*1-vektorer. z = x(1:5); x(4), x(5), som kolonnvektor % z blir delvektorn x(1), x(2), x(3), z = x(1:5) + y(2:6); % Fem element ur vardera vektor adderas och bildar en ny vektor z x(9) z = x(1:2:9); % Delvektorn x(1), x(3), x(5), x(7), Detta kan användas för att exempelvis vända på en vektor. z = x(9:-1:1); Detta gäller även för matriser. A(3:6,2:7) som ger matrisen a(3,2)... a(3,7)...... a(6,2)... a(6,7) Speciellt kan man hantera bara en rad/kolonn av en matris. A(3,:) A(:,4) % Ger tredje raden % Ger fjärde kolonnen
Kolon-notation Med ett kolon kan man enkelt skapa talserier. a = 3 : 8; 6 element. % Talserie från 3 till 8, a blir en vektor med x = 0:0.01:1; % Vektor med längd 101, innehåller värdena 0, 0.01, 0.02,..., 1
Egna funktioner! Motsvarar närmast Javas static-metoder. En funktion skapas exempelvis för att beräkna sinx/x, och även returnera 1 då x = 0: function r = singx(x) if x == 0 r = 1; else r = sin(x)/x; % End of singx (Denna kommentar är onödig, men trevlig att ha för att se slutet på funktionen) Funktionen skall skrivas i en egen fil, förslagsvis med samma namn som funktionen. Alla variabler i funktionen är lokala inom funktionen och kan inte kommas åt utifrån. Funktionen anropas sedan på samma sätt som standardfunktionerna. Om man har olika namn på funktionen och namnet på filen så anropas funktionen med filnamnet (som vanligt) men den går automagiskt till den första funktionen i filen. Man kan ha fler funktioner i samma fil, men dessa kan bara användas inom filen, det är bara den första funktionen som går att anropas utifrån.