Sida 1 av 1
Matlab-tråden
Postat: 23 januari 2013, 21:07:55
av Walle
Jag tyckte det behövdes en allmän "frågor om matlab"-tråd. Speciellt eftersom jag håller på att lära mig matlab, så jag har massor med frågor

Jag kommer uppdatera det här inlägget med frågor vartefter de kommer upp under kvällen och imorgon. Sen klipper jag nog in svaren i det här inlägget så det blir enkelt och bra för andra som läser tråden.
Mjukstartar lite med en enkel(?).
Jag har en 1*n-matris "A" med värden av datatypen double. Nu vill jag subtrahera 1+n*x från varje cell (där n alltså är cellnumret med 1 som första cell). Hur gör jag enklast?
Re: Matlab-tråden
Postat: 24 januari 2013, 00:21:02
av Andax
Du skriver t.ex.: B = A - (1+(1:n)*x);
1:n är en 1*n matris vars celler har värdet från 1 till n.
Nu fattade jag att x bara är en konstant. Är x t.ex. En vektor med längden n kan man ersätta (1:n)*x med (1:n).*x för elementvis multiplikation.
Re: Matlab-tråden
Postat: 24 januari 2013, 01:15:14
av 4kTRB
Fungerar tips i denna tråd också till Octave och Scilab?
Eller ska de ha en egen tråd?
Re: Matlab-tråden
Postat: 24 januari 2013, 10:41:05
av SvenW
Octave och Matlab är väldigt lika. Även Scilab tror jag.
Så nej, det behövs ingen särskild tråd IMHO.
>> Du skriver t.ex.: B = A - (1+(1:n)*x);
Om matrisen har fler dimesioner går det bra att slriva B = A - (1+(1:n).*x);
a.*b står för elelment-vis multiplikation.
Re: Matlab-tråden
Postat: 24 januari 2013, 12:28:57
av Walle
Så länge syntaxen är lika eller snarlik så kvittar det väl vilket program man använder?
Andax skrev:Du skriver t.ex.: B = A - (1+(1:n)*x);
1:n är en 1*n matris vars celler har värdet från 1 till n.
Nu fattade jag att x bara är en konstant. Är x t.ex. En vektor med längden n kan man ersätta (1:n)*x med (1:n).*x för elementvis multiplikation.
Aha!
Så är det i princip samma sak som att i matlab skriva?:
C=(1:n);
B = A - (1+C*x);
Jag har inte riktigt förstått att man kan använda () för att assigna en matris var som helst i koden. Jag är van vid C-syntax, men matlab är ju något helt annat
Riktigt att x bara är en konstant, skulle ha kallat den k istället (problemet med att lära mig matlab är att jag också måste lära mig matematik

).
I det här fallet är syftet att göra en slags normalisering (eller vad man nu ska kalla det) av en kurva där varje värde på y aldrig kan vara lägre än det förra, och som är förhållandevis linjär. Syftet är att så att säga "lägga kurvan ner" (så att "best fit"-linjen är horisontell och på noll), utan att normalisera värdena till 0 till 1 eller -1 till 1.
Svart är orginal, röd är "best fit". Grön är kurvan efter "rotering" (jag är medveten om att det är något helt annat än en trigonometrisk rotation, jag tror den här operationen snarare blir en skjuvning av datat) och blå är "best fit"-linjen för det "roterade" datat.
Curve.JPG
Edit: Plottar man med axlarna i samma skala ser man bättre vad som verkligen händer. I det här fallet är datat de 25 första primtalen
Curve2.JPG
Fler frågor kommer att komma, men inte just nu. Jag hade några små dumma frågor till på lager, men löste dom medan jag satt och skrev
Edit:
Nu har jag en ny fråga: Om jag vill finna "avståndet" mellan n och n+1 (alltså (n+1)-n) celler i en vektor med längd n och få resultatet som en n-1 lång vektor, finns det något "magiskt" sätt, eller är det bara att skriva en egen funktion för det som itererar genom hela vektorn?
Re: Matlab-tråden
Postat: 24 januari 2013, 16:43:25
av snigelen
> Om jag vill finna "avståndet" mellan n och n+1 (alltså (n+1)-n)
Menar du diff? Typ
Kod: Markera allt
>> n=(1:10).^2
n =
1 4 9 16 25 36 49 64 81 100
>> diff(n)
ans =
3 5 7 9 11 13 15 17 19
> en egen funktion för det som itererar genom hela vektorn?
Man behöver sällan iterera genom en vektor i matlab, det mesta går att lösa med matris och vektoroperationer.
Re: Matlab-tråden
Postat: 24 januari 2013, 18:02:29
av Walle
Haha, så enkelt det kan vara! Det var exakt så jag menade!
Edit: Ny fråga: Jag vill reversera en vektor från och med den andra cellen, d.v.s. 1 2 3 4 5 6 7 8 9 blir 1 9 8 7 6 5 4 3 2.
y=fliplr(x(2:n)) hoppar ju över det första elementet helt. D.v.s. returnerar 9 8 7 6 5 4 3 2.
Edit: Löste det, det var inte så svårt. y = horzcat(x(1), fliplr(x(2:end)))
Re: Matlab-tråden
Postat: 25 januari 2013, 08:59:50
av snigelen
Du kan även indexera i omvänd ordning (eller i vilken ordning som helst). T.ex
Kod: Markera allt
>> n=1:9
n =
1 2 3 4 5 6 7 8 9
>> nrev = [n(1) n(end:-1:2)]
nrev =
1 9 8 7 6 5 4 3 2
Jag kan komplettera föregående diff med den "omvända" operationen. Har man den differentierade vektorn och första elementet i orginalvektorn så kan denne återskapas med cumsum. T.ex.
Kod: Markera allt
>> n=(1:10).^2
n =
1 4 9 16 25 36 49 64 81 100
>> diffn = diff(n)
diffn =
3 5 7 9 11 13 15 17 19
>> cumsum([n(1) diffn])
ans =
1 4 9 16 25 36 49 64 81 100
Re: Matlab-tråden
Postat: 25 januari 2013, 09:25:24
av Andax
Walle, med tanke på dina grafer så är 'polyfit' och 'polyval' två funktioner som du säkert kan ha nytta av framöver. polyfit minstakvadrat-anpassar ett polynom y = p(x) av valbar ordning (t.ex. N = 1 rät linjer, N = 2 andragradare) till ett dataset.
p = polyfit(x,y,N)
när man sedan vill räkna fram y-värden för olika x använder man sedan bara:
y = polyval(p,x) där x kan vara en vektor. Dy blir y en lika lång vektor.
Re: Matlab-tråden
Postat: 28 januari 2013, 12:01:08
av Walle
snigelen: Ah, jag börjar förstå hur man använder parenteserna i Matlab nu

Det är så anorlunda från vad man är van med..
Andax: Faktum är att det är just Polyfit och Polyval som jag har använt för att få till min så kallade "best fit-line". Men tackar ändå, det är en bra funktion som bör omnämnas i tråden
Edit: Nu har jag kört fast igen..
Om jag vill definiera en 2D-matris med en funktion för värdet för varje cell, hur gör jag då? Säg t.ex. att:
x = (0:1:300);
y = (0:1:100);
och jag vill använda funktionen z = x*y^2 (som exempel bara) för att få en 301*101-matris, hur ser korrekt kod ut då?
Re: Matlab-tråden
Postat: 28 januari 2013, 20:31:10
av JustNeed
Kul att se ett problem som man själv hade för bara ett litet tag sen.
Tror det gick någonting såhär:
x = (0:1:300);
y = (0:1:100);
[x,y] = meshgrid(x,y);
z = x*y^2;
Re: Matlab-tråden
Postat: 28 januari 2013, 20:47:53
av Walle
Strålande, tackar!

Enda skillnaden var att jag fick klämma in två punkter i z = x.*y.^2;
Hur tolkas delen [x,y] av matlab?
Re: Matlab-tråden
Postat: 28 januari 2013, 21:11:16
av JustNeed
Som två vektorer.
Hjälp-sektionen:
[X,Y] = meshgrid(x,y) transforms the domain specified by vectors x and y into arrays X and Y, which can be used to evaluate functions of two variables and three-dimensional mesh/surface plots. The rows of the output array X are copies of the vector x; columns of the output array Y are copies of the vector y.
Re: Matlab-tråden
Postat: 28 januari 2013, 22:47:50
av snigelen
eller med andra ord. En funktion i matlab kan returnera noll eller fler funktionsresultat. Om den returnerar minst två resultat så är det syntaxen för att få första resultatet i variabeln x och det andra i variablen y.
Så det har inget direkt att göra med den andra användningen av hakparenteser, att bygga vektorer och matriser. T.ex en 2x2-matris x, en 2x1-matris y sätts ihop till en 2x3-matris z
Kod: Markera allt
>> x = [1,2;3,4]
x =
1 2
3 4
>> y = [5;6]
y =
5
6
>> z=[x,y]
z =
1 2 5
3 4 6
Man kan använda mellanslag i stället för komma.