Ur MATLAB-manualen citerar vi följande: "At the heart of MATLAB is a new language that you'll have to learn before you can fully exploit its power. Don't be intimidated (sv avskräckt) - you can pick up the basics of MATLAB in just a few minutes and mastery comes after only a few hours of use. You'll be rewarded with high-productivity, high-creativity computing power that users say "changes their lives".
Detta citat har visserligen kommersiell bakgrund, men det är ingen tvekan om att det rymmer en verklig sanning.
Vi beskriver den version av MATLAB, version 4.2a, som nu finns för datorerna.
< M A T L A B (R) > (c) Copyright 1984-94 The MathWorks, Inc. All Rights Reserved Version 4.2a May 13 1994 Commands to get started: intro, demo, help help Commands for more information: help, whatsnew, infoföljt av ett redotecken (eng prompt) i form av
>>som anger att programmet är berett att ta emot nya uppdrag. För att avsluta MATLAB skriver man kommandot quit, men det gör vi naturligtvis inte nu. Vi kan skriva in matematiska uttryck som beräknas, t ex om vi vill ha värdet av sin(p/4)
>> sin(pi/4) ans = 0.7071Värdet skrivs ut föregånget av ett variabelnamn ans (av eng answer). Här och i fortsättningen återger jag användarens inmatning i fetstil. Men vi kan också koppla värden till variabler. Variabler fungerar som i t ex Pascal, men deklareras inte. Exempelvis placerar följande två instruktioner först värdet av p/4 i variabeln t och därefter värdet av sin(t), dvs sin(p/4), i variabeln y.
>> t=pi/4,y=sin(t) t = 0.7854 y = 0.7071Tilldelningstecknet är tydligen "=". Värdet skrivs i båda fallen ut tillsammans med tillhörande variabelnamn. När man som här skriver flera satser (instruktioner, kommandon) på en rad separeras de med kommatecken (,). Om man inte vill ha utskrift avslutar man en sats med ett semikolon, som samtidigt fungerar som separator, t ex
>> t=pi/4;y=sin(t); >>Variabelnamn skrivs med bokstäver och siffror. Systemet skiljer på stora och små bokstäver. T ex är Y och y olika variabler. Det finns många fördefinierade namn, vars ursprungliga betydelse förloras om man tilldelar det ett eget värde. Ingen skillnad görs på heltal och allmänna reella tal.
>> x=sinus(2) ??? Undefined function or variable. Symbol in question ==> sinus >>När man trycker på uppåtpilen övergår den sista raden i
>> x=sinus(2)som man sedan kan redigera till det korrekta med vänsterpil och raderingstangent. När man sedan trycker på returtangenten utförs kommandot.
Ett kommando kan avbrytas med avbrottssignalen som typiskt är Ctrl-C.
Vektorer och vanliga tal är specialfall av matriser, som illustreras i figuren. En radvektor kan uppfattas som en enradig matris. Ett enda tal kan ses som en enradig matris med en kolumn. Alla variabler innehåller automatiskt uppgift om den aktuella storleken. Alla index löper från 1 och uppåt.
Ett konkret exempel på en vektor är en digitaliserad ljudsignal. En digitaliserad bild är på samma sätt en matris.
Vi sysslar här mest med radvektorer för att hålla nere textmassan.
>> t=[0,0.2,0.3,1] t = 0 0.2000 0.3000 1.0000Vi kan nu beräkna sinus för samtliga tal i vektorn med
>> y=sin(t) y = 0 0.1987 0.2955 0.8415Är talen i vektorn konsekutiva finns det ännu enklare sätt. Man skriver startvärdet, stegvärdet och slutvärdet, skilda åt med kolon (:). T ex får vi en vektor med de elva elementen 0, 0.1, ..., 1.0 med
>> t=0:0.1:1 t = Columns 1 through 7 0 0.1000 0.2000 0.3000 0.4000 0.5000 0.6000 Columns 8 through 11 0.7000 0.8000 0.9000 1.0000Man behöver inte ange något stegvärde om det är 1. Även negativa steg tillåts.
Det finns flera funktioner med vilka speciella vektorer/matriser kan bildas. Samtliga följande kan anropas med parametrar enligt följande modeller
>> rand(1,5) ans = 0.2190 0.0470 0.6789 0.6793 0.9347q
Man refererar till ett enstaka vektorelement med vektornamnet följt av index inom vanliga parenteser, t ex t(5). En del av en vektor kommer man åt med t ex t(3:6).
En vektor kan utvidgas dynamiskt på ett par sätt. Om a och b är radvektorer så ger [a,b] en ny vektor som inleds med a:s element och avslutas med b:s. Speciellt är [a] samma vektor som a. Byts kommatecknet mot ett semikolon, dvs [a;b], får man i stället en tvåradig matris. Man kan också ge ett element utanför den ursprungliga vektorn ett värde, varvid mellanliggande element automatiskt tillkommer och nollställes.
Exempel: Dynamisk utvidgning.
Med t som ovan ger (%-tecken inleder kommentarer i MATLAB)
>> a=t(1:6); % De 6 första elementen i vektorn t >> [a;sin(a)] ans = 0 0.1000 0.2000 0.3000 0.4000 0.5000 0 0.0998 0.1987 0.2955 0.3894 0.4794 >> a=[7,3,12] a = 7 3 12 >> a(7)=1 a = 7 3 12 0 0 0 1q
Exempel: Några vektoroperationer.
Här görs först en elementvis addition. Sedan ett försök att multiplicera med den vanliga *, vilket ger felmeddelande, beroende på att * som sagt har speciell betydelse. Man måste använda .*, vilket vi gör till sist.
>> a=[1,2,3];b=[4,5,6]; >> a+b ans = 5 7 9 >> a*b ??? Error using ==> * Inner matrix dimensions must agree. >> a.*b ans = 4 10 18q
Som vi redan sett kan man applicera en funktion på samtliga element i en vektor på en gång
>> sin(a) ans = 0.8415 0.9093 0.1411Det finns också ett antal reducerande funktioner, som arbetar på en vektor och returnerar ett tal. Bl a
>> sum(ones(1:100)./[1:100].^2) % Först skapas en vektor med idel ettor och längden 100 % Därpå en med elementen 1,2,3,4,...,100, vilka kvadreras % Sedan divideras den första elementvis med den andra % Slutligen summeras termerna ans = 1.6350Det går också att skriva på följande vis. Observera dock att 1 inte står för en vektor utan för ett tal, som sedan delas med vart och ett av talen i vektorn [1:100].^2).
>> sum(1 ./[1:100].^2)q
Till slut nämner vi ett par kraftfulla funktioner som arbetar på vektorer och ger vektorer som resultat.
>> sort([7,9,1,3,12,4]) ans = 1 3 4 7 9 12q
Exempel: Nollställen till polynomet
>> roots([1,7,3,9]) %Högstagradskoefficienten först ans = -6.7531 -0.1234 + 1.1478i -0.1234 - 1.1478iq
Matriser bildas och hanteras på ett likartat sätt. T ex ger följande rad en tvåradig matris. Man separerar alltså matrisraderna med semikolon. Samtliga rader måste vara lika långa.
>> a=[1,2,3;7,1,9] a = 1 2 3 7 1 9 >> sin(a) ans = 0.8415 0.9093 0.1411 0.6570 0.8415 0.4121Lösningen till ett linjärt ekvationssystem med lika många ekvationer som obekanta skrivet på matrisform Ax=y löses enkelt med x=A\y.
Exempel: Lös ett slumpmässigt valt 5x5-system.
>> A=rand(5,5);y=rand(5,1); >> x=A\y x = -0.9415 -0.3964 -0.2770 0.8923 1.6482q
>>(1+i)*(2+3i) ans = -1.0000+5.0000iOlyckligtvis är i en vanlig variabel (eller funktion om man nu skall vara petig), vars fördefinierade värde kan ändras. Det kan ställa till trassel, så undvik att använda det variabelnamnet för eget bruk. Den ursprungliga betydelsen kan alltid återställas med tilldelningen i=sqrt(-1).
Funktionerna real resp imag tar ett komplext tal som parameter och ger realdel respektive imaginärdel.
>> s='Fredrika'; >> s(5:7) ans = rik
Den tillgängliga funktionen för 2D-ritning heter plot och kan anropas på ett flertal olika sätt, bl a
Exempel: Vi vill rita upp kurvan y=sin(x)/x på intervallet [-20,20].
Vi börjar med att diskretisera det intervallet och räknar sedan ut motsvarande y-värden. Självfallet blir den faktiskt uppritade kurvan mjukare om man väljer x-värden tätt.
>> x=-20:0.1:20; >> y=sin(x) ./ x ; Warning: Divide by zeroVarningen som inte är så oväntad kan vi ignorera. Funktionens matematiska värde för x=0 är ju 1, men MATLAB räknar ut det som 0/0, som i allmänhet är odefinierat, och MATLAB ger därför värdet NaN, som står för NotANumber. Sedan begär vi uppritning med
>> plot(x,y)vilket resulterar i att det dyker upp ett ritfönster (Figure) om det inte redan fanns framme och kurvan ritas.
Bild 12. sin(x)/x
q
Begärs ny ritning kommer det gamla fönstret att raderas. Dock bibehålles det gamla innehållet med kommandot
>> hold onsom kan återtas med
>> hold offMan kan skriva text i ritfönstret med
>> text(xpos,ypos,'Det som skall skrivas')där (xpos,ypos) anger startpositionen uttryckt i den skala som gäller för stunden. Man raderar ritfönstret utan att ändra skalan med
>> clf %clear figure, hette förut clgSkalan sätts automatiskt och är normalt inte likformig längs de båda axlarna. Med kommandot axis (gör help axis för detaljer) kan du få annat beteende.
MATLAB har också en del funktioner som arbetar på litet högre nivå. En sådan är fplot som tar ett funktionsnamn skrivet som en sträng och en vektor som anger x-intervallet som parametrar och ritar kurvan. Om t ex sinc är funktionen sin(x)/x (hur man gör egna sådana tas upp längre fram), så ritas samma kurva med (diskretiseringen är dock som standard grövre)
>> fplot('sinc',[-20 ,20])
Personligen skulle jag hellre vilja kunna skriva t ex
>> myplot('sin(x) ./ x',xmin,xmax)dvs ange uttrycket som en sträng utan att behöva införa en särskild funktion. Det är inte alltför svårt att tillverka ett sådant verktyg.
När det gäller 3D-grafik är MATLAB från och med version 4 kraftfull men tvingar användaren till en mängd svårförståeliga åtgärder. Acceptera inte det! Jag erbjuder dig i stället en specialfunktion (procedur) för ritning av funktionsytor (källkoden anges längre fram) som i varje fall är lättanvänd.
Exempel: Vi vill rita upp ytan z=sin(r)/r där r=sqrt(x^2+y^2).
Den är en motsvarighet till den tidigare uppritade funktionskurvan. Vi gör det över kvadraten -8x8, -6y6. Vi använder min specialfunktion.
>> myplot3d('sin(sqrt(x.^2+y.^2))./sqrt(x.^2+y.^2)', -8,8,-6,6) Warning: Divide by zerooch får den ofta visade hatten, sombreron. Axeltexterna i figuren tillverkades med
>> xlabel('x-axeln');ylabel('y-axeln')Bild 13. sin(r)/r, r=sqrt(x^2+y^2).
Med modifieringar i specialfunktionen kan man få ytan färglagd på olika sätt.
q
Anmärkning: Ritningen i den nämnda specialfunktionen bygger på att man diskretiserar funktionsytan över ett rutnät, dvs beräknar f(x,y) i ett antal punkter. Vi får då en matris av funktionsvärden. Och matriser är något som MATLAB kan visualisera, med en inbyggd funktion mesh. Nedan skapas t ex matris av ordning 15x15 med två icke-nollelement, som sedan ritas upp
>> a=zeros(15); a(5,5)=1; a(12,4)=0.6; >> mesh(a)vilket resulterar i bilden (man kan påverka tittriktning m m med andra kommandon)
Bild 14. Matris av ordning 15x15 visualiserad. Till höger antyds uppritningssättet: a(i,j) förbinds med elementen i de fyra markerade punkterna med räta linjer.
Byts mesh mot surf får man en färglagd yta och inte bara en massa streck.
Exempel: Vi begär hjälp kring sin-funktionen.
>> help sin SIN SIN(X) is the sine of the elements of X.q
I hjälptexterna står namnen med stora bokstäver i avsikten att framhäva dem. Men - och detta är förvirrande - du skall skriva dem med små.
För en del operatorer krävs för närvarande två steg, t ex
>> help + Du hänvisas vidare till arith >> help arith + Plus. X + Y adds matrices X and Y. X and Y must have the same dimensions unless one is a scalar (a 1-by-1 matrix).A scalar can be added to anything.Naturligtvis kan man även få upplysningar om kommandot help:
>> help help HELP On-line documentation. HELP, by itself, lists all primary help topics. Each primary topic corresponds to a directory name on MATLABPATH. "HELP topic" gives help on the specified topic. The topic can be a command name or a directory name. If it is a command name, HELP displays information on that command. If it is a directory name, HELP displays the Table-Of-Contents for the specified directory. For example, "help general" lists the Table-Of-Contents for the directory toolbox/matlab/general. etcOm vi inte känner till namnet på en konstruktion kan vi därför eventuellt hitta den genom att be MATLAB ge oss en lista. Med enbart kommandot help får vi ett antal ämnesområden. Rikedomen framträder tydligt.
>> help HELP topics: matlab/general - General purpose commands. matlab/ops - Operators and special characters. matlab/lang - Language constructs and debugging. matlab/elmat - Elementary matrices and matrix manipulation. matlab/specmat - Specialized matrices. matlab/elfun - Elementary math functions. matlab/specfun - Specialized math functions. matlab/matfun - Matrix functions - numerical linear algebra. matlab/datafun - Data analysis and Fourier transform functions. matlab/polyfun - Polynomial and interpolation matlab/funfun - Function functions - nonlinear numerical methods. matlab/sparfun - Sparse matrix functions. matlab/plotxy - Two dimensional graphics. matlab/plotxyz - Three dimensional graphics. matlab/graphics - General purpose graphics matlab/color - Color control and lighting model matlab/sounds - Sound processing functions. matlab/strfun - Character string functions. matlab/iofun - Low-level file I/O functions. matlab/demos - Demonstrations and samples. etc For more help on directory/topic, type "help topic".Låt oss t ex se efter vad det finns för några elementära funktioner.
>> help elfun Elementary math functions. Trigonometric. sin - Sine. sinh - Hyperbolic sine. asin - Inverse sine. asinh - Inverse hyperbolic sine. cos - Cosine. cosh - Hyperbolic cosine. acos - Inverse cosine. acosh - Inverse hyperbolic cosine. tan - Tangent. tanh - Hyperbolic tangent. atan - Inverse tangent. atan2 - Four quadrant inverse tangent. atanh - Inverse hyperbolic tangent. sec - Secant. sech - Hyperbolic secant. asec - Inverse secant. asech - Inverse hyperbolic secant. csc - Cosecant. csch - Hyperbolic cosecant. acsc - Inverse cosecant. acsch - Inverse hyperbolic cosecant. cot - Cotangent. coth - Hyperbolic cotangent. acot - Inverse cotangent. acoth - Inverse hyperbolic cotangent. Exponential. exp - Exponential. log - Natural logarithm. log10 - Common logarithm. sqrt - Square root. Complex. abs - Absolute value. angle - Phase angle. conj - Complex conjugate. imag - Complex imaginary part. real - Complex real part. Numeric. fix - Round towards zero. floor - Round towards minus infinity. ceil - Round towards plus infinity. round - Round towards nearest integer. rem - Remainder after division. sign - Signum function.De inbyggda funktionerna ingår i själva MATLAB-programmet, medan de övriga ligger som filer precis som de funktioner man tillverkar själv. Vill du studera källkoden till en sådan funktion går det - som redan nämnts - bra med type-kommandot inuti MATLAB (de kan naturligtvis också inspekteras med ett vanligt redigeringsprogram). Det är dock få som är korta och lättbegripliga.
Ett annat hjälpkommando är lookfor som letar upp alla kommandon som i sin hjälptext innehåller en angiven söksträng, t ex
>> lookfor mesh MESHDOM Generate X and Y arrays for 3-d plots. MESHGRID Generation of X and Y arrays for 3-D plots. UNMESH Convert a list of mesh edges to a graph or matrix. HIDDEN Mesh hidden line removal mode. MESH 3-D mesh surface. MESHC Combination MESH/CONTOUR plot. etc
Som hjälpkommandon kan vi även räkna info, computer och demo. Gör exempelvis help computer om du vill veta mer.
Text kan markeras och kopieras som när det gäller alla andra fönster. Bilder fordrar däremot betydligt mer arbete. Det finns två sätt.
>> print -deps -epsi filnamnDenna rad skapar en fil filnamn.eps, som kan importeras till FrameMaker (på skärmen ser kanske resultatet i FrameMaker inte så bra ut, men utskriften blir superb).
Med program som gs eller ghostview kan du beskåda bilden som lagrats i filnamn.eps.
2. Tag en rasterkopia av skärmen (se UNIX-kapitlen; kan också göras från FrameMaker) och importera den i ditt dokument. Då blir bildens kvalitet i den slutliga utskriften som på skärmen. Många laserskrivare misslyckas med eller tar lång tid på sig för motsvarande filer (speciellt från färgskärmar).
Vill du bara ha utskrift på papper av bilden i ritfönstret kan du skriva
Exempel: Låt oss börja med ett exempel kring FOR.
>> for i=1:5 a(i)=1/i; endHär sägs att variabeln i skall genomlöpa värdena 1 till och med 5 (steget 1) och att för varje gång a(i) skall ges värdet 1/i. Inget händer förrän man skrivit end och tryckt på returtangenten. Utan semikolonet skulle vi fått utskrift av vektorn a i varje varv. Det går bra att skriva allt på en rad men då måste som vanligt kommatecken stoppas in som separator om det inte redan finns ett semikolon, t ex
>> for i=1:5, a(i)=1/i; endObservera att om vektorn a inte finns, så skapas en ny vektor som successivt utökas till att ha 5 element. Vi kan kontrollera resultatet med
>> a a = 1.0000 0.5000 0.3333 0.2500 0.2000Det bör observeras att det oftast (speciellt för långa vektorer) går väsentligt snabbare när man använder vektoroperationer, t ex kan ovanstående göras som visades i vektoravsnittet.
>> a=ones(1,5) ./ (1:5) a = 1.0000 0.5000 0.3333 0.2500 0.2000Härvid bildas först en radvektor med 5 ettor, vilken sedan divideras elementvis med vektorn 1:5, dvs [1,2,3,4,5]. Parenteserna är prioritetsparenteser (det skulle även gått bra med hakparenteser eftersom [1:5] är samma vektor som 1:5). Utan dessa får man på grund av något förrädiska prioritetsregler
a = 1 2 3 4 5q
Formen för FOR-snurran är
eller om du vill ha en en-radare (trots den sämre läsbarheten)
där satsseparatorn alternativt kan vara semikolon. Variabeln genomlöper i tur och ordning de värden som finns i vektorn och för varje gång utförs satserna mellan for och end. Om vektorn är 1:10 genomlöpes således 1,2,3,...,10. Om den är 0:0.1:1 genomlöpes 0,0.1,0.2,...,1.0. Om den är [7,3,9] genomlöpes 7,3,9. FOR-snurran är tydligen något kraftfullare än i Pascal. Notera för övrigt att inget then begin förekommer som i Pascal.
WHILE-snurrans form är likartad:
>> 1==2 ans = 0Slutligen illustreras IF-konstruktionens kapacitet med några varianter
WHILE- och IF-konstruktionerna kan också skrivas på en rad, men glöm då inte kommatecken eller semikolon efter satserna före t ex else och end och inte heller efter t ex WHILE-delen.
Exempel: If
Följande enradiga (notera att alla kommatecken är nödvändiga) IF-konstruktion ger resultatet 4 om a är skild från 0 och 7 enbart om a har värdet 0.
>> if a,4,else 7,end ans = 7q
Låt oss titta på en av de funktioner som finns i den verktygslåda som alltid ingår i MATLAB, nämligen sinh-funktionen. Medan sin är en inbyggd funktion hör sinh alltså till en verktygslåda. Källtexten till verktygslådefunktionerna och egna funktioner kan man titta på inifrån MATLAB genom att använda kommandot type (man kan naturligtvis även använda ett redigeringsprogram, i det här fallet på filen sinh.m i lämplig katalog).
Anm. Från version 4 är denna funktion omständligare men bättre.
>> type sinh function y = sinh(x) %SINH SINH(X) is the hyperbolic sine of the elements of X. y = (exp(x) - exp(-x))/2; >>Först i varje funktion finns en rad som inleds med ordet function och avslutas med funktionsnamnet och en lista med inparametrar. Däremellan finns eventuellt en utparameterlista omgärdad av hakparenteser och följd av =. I sinh-exemplet finns bara en utparameter y och då behövs inte de omgärdande hakparenteserna.
Om funktionen inte skall returnera något värde (och då närmast är att betrakta som en sorts procedur), förekommer ingen utparameter och då slopas hakparenteser såväl som likhetstecken. Funktionen behöver inte ha några inparametrar och då slopas parenteserna. Inledningsraden kan sägas beskriva anropssättet. En funktion anropas enligt
Exempel: Funktioner
Funktionen strunt nedan skall demonstrera möjligheterna. Den finns som en fil strunt.m. Först listar vi den inuti MATLAB, sedan begär vi hjälp och slutligen ger vi exempel på några korrekta och felaktiga anrop.
>> type strunt function [a,b]=strunt(x,y) % STRUNT [a,b]=strunt(x,y) returns 2*x in a and 2*y in b a=2*x; b=2*y; >> help strunt STRUNT [a,b]=strunt(x,y) returns 2*x in a and 2*y in b >> [p,q]=strunt(3,5) p = 6 q = 10 >> strunt(3,5) % No actual outparameters => only first % part of the value returned ans =6 >> p=strunt(3) % Too few actual inparameters ??? Input argument is undefined. Symbol in question ==> y Error in ==> strunt.m On line 3 ==> a=2*x; b=2*y; >> p=strunt(3,5,6) % Too many actual inparameters ??? Error using ==> strunt Too many input arguments.q
Det finns många fördefinierade namn i MATLAB och dess verktygslådor och användaren kan som sagt införa egna variabler och funktioner. Det vore orimligt om användaren skulle behöva komma ihåg alla fördefinierade namn. Därför följer MATLAB en prioriteringslista vid tolkningen av ett namn. Om svaret på en av frågorna är ja, så följs motsvarande tolkning.
2. Är det en inbyggd funktion?
3. Är det en funktion i aktuell katalog (dvs i den som MATLAB startades ifrån eller till vilken man gjort cd(MATLAB-kommando) senast)?
4. Är det en funktion i standardverktygslådan?
5. Är det en funktion i den gemensamma lokala MATLAB-katalogen (vanligen ..../matlab/toolbox/local)?
6. Är det en funktion i någon verktygslåda?
7. Är det en funktion i användarens MATLAB-katalog (vanligen ~/matlab)? Det är lämpligt att ha en sådan katalog hos sig och antingen utföra allt MATLAB-arbete där eller åtminstone spara viktigare egna funktioner där.
Anmärkning: MATLAB är ett professionellt system. Men just funktionen sinh, som vi såg på i början av avsnittet, är ett exempel på amatörmässighet. Den fungerar utmärkt för de flesta x-värden, men inte för små värden på grund av s k kancellation. Om t ex x=0.000000001 får man med lång utskrift (se senare avsnitt)
>> sinh(x) ans =1.000000027229220e-09vilket är precis vad formeln i funktionen ger. Detta värde är felaktigt redan i 9:e siffran (vilket kanske inte stör dig). Det hade varit lätt att skriva funktionen så att den alltid ger bortåt 16 riktiga siffror. Det har man också gjort i version 4. Vi hänvisar till numerisk analys för detaljer.
Det finns ytterligare en sorts m-filer, som bara består av ett antal rader med MATLAB-kommandon. En sådan m-fil, som ibland kallas kommandofil, namnges och anropas som en funktion. Vid anropet utförs kommandona i filen som om man skrivit in dem.
Exempel: myplot3d
Till sist får du utan närmare kommentarer källkoden till den i grafik-avsnittet nämnda funktionen (proceduren) myplot3d. Den första parametern måste vara en sträng som innehåller ett uttryck i x och y!
function myplot3d(expr,x0,x1,y0,y1) N=80; % Antal steg i respektive riktning. Alternativt parameter. stepx=(x1-x0)/N;stepy=(y1-y0)/N; [x,y]=meshgrid(x0:stepx:x1,y0:stepy:y1); z=eval(expr); mesh(x,y,z) % Eller surf(x,y,z)som ger en riktig ytaq
>> a=input('Ange tal!') Ange tal!345 a =345 >>Den andra, pause, låter användaren beskåda ett mellanresultat i lugn och ro
>> pause >>Först när användaren trycker på någon tangent kommer redotecknet.
Den tredje, ginput, låter oss markera punkter med musen i ett ritfönster och returnerar punkternas koordinater uttryckta i fönstrets aktuella koordinatsystem i två vektorer. T ex om vi begär två punkter.
>> [x,y]=ginput(2) x = 7.1399 -1.1952 y = -0.3164 -0.8709X-koordinaterna hamnar i vektorn x och y-koordinaterna i y. Vi kan sedan rita in dessa punkter ovanpå den befintliga figuren med
>> hold on % Om det inte redan är gjort >> plot(x,y,'+')Med viss ansträngning går det med hjälp av ginput att göra musstyrda interaktiva program, t ex program för elkretskonstruktion.
>> who Your variables are: a b c >> clear b >> who Your variables are: a c
Exempel:
>> format long % enbart format återställer >> y=sin(t) y = 0.70710678118655 >> format hex >> x=1 x = 3ff0000000000000Alla beräkningar genomförs med ungefär 16 decimala siffror oberoende av utskriftsformatet.
>> x=1/0 Warning: Divide by zero x = Inf >> 1/x ans = 0Vi har också tidigare som hastigast nämnt NaN (NotANumber) som dyker upp när resultatet inte är matematiskt definierat, t ex
>> 0/0 Warning: Divide by zero ans = NaN
>> whitebgSamma kommando byter tillbaka. Ges kommandot efter första ritkommandot kan färgvalet bli litet tokigt.
>> a=1;b=2;x=3;eval('a+b*x') ans = 7
>> save namnvarvid samtliga variabler sparas i filen namn.mat (en sådan fil kallas mat-fil). Även enstaka variabler kan sparas (se help save). Inläsning av variablerna sker sedan med
>> load namnI detta fall sker lagringen på ett format som inte är direkt mänskligt läsbart. Med viss möda kan man från egna program (skrivna i t ex Pascal) läsa och skriva filer på detta format, vilket ger en möjlighet till import/export, t ex för att utnyttja beräkningskraften eller visualiseringsförmågan i MATLAB. Enklare är dock oftast att i stället gå via vanliga textfiler. Enstaka variabler kan nämligen också sparas på textform och senare återhämtas. T ex
>> a=[1,2;3,4]; % En variabel >> save namn.dat a /ascii /double % Sparar a i filen namn.dat >> clear a % Radera a >> load namn.dat % Läs in a igen >> a % Värdena finns inte som variabeln a utan som % variabeln namn ??? Undefined function or variable. >> namn namn = 1 2 3 4I detta fall är filen en s k dat-fil, som kan läsas och redigeras med vilket redigeringsprogram under UNIX som helst, t ex (> är redotecknet i UNIX)
> cat namn.dat 1.00000000000000e+00 2.00000000000000e+00 3.00000000000000e+00 4.00000000000000e+00
>> MATH('N[Pi,50]') % MATH är finns nog ej automatiskt ans=3.14159265358979323846264338327950288419716939937510 >> s=MATH('D[Exp[x]*Cos[x*x],x]') s=e.^x.*cos(x.^2)-2.*e.^x.*x.*sin(x.^2) >> e=exp(1); % e är inte fördefinierad i MATLAB >> x=0:0.1:2; >> plot(x,eval(s))
Generated with CERN WebMaker