Matlab-tråden

Elektronik- och mekanikrelaterad mjukvara/litteratur. (T.ex schema-CAD, simulering, böcker, manualer mm. OS-problem hör inte hit!)
Användarvisningsbild
Walle
Moderator
Inlägg: 7701
Blev medlem: 14 december 2004, 10:32:18
Ort: Stockholm

Matlab-tråden

Inlägg 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?
Användarvisningsbild
Andax
Inlägg: 4379
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

Re: Matlab-tråden

Inlägg 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.
Användarvisningsbild
4kTRB
Inlägg: 20676
Blev medlem: 16 augusti 2009, 19:04:48

Re: Matlab-tråden

Inlägg av 4kTRB »

Fungerar tips i denna tråd också till Octave och Scilab?
Eller ska de ha en egen tråd?
SvenW
Inlägg: 1156
Blev medlem: 24 april 2007, 16:23:10
Ort: Göteborg

Re: Matlab-tråden

Inlägg 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.
Användarvisningsbild
Walle
Moderator
Inlägg: 7701
Blev medlem: 14 december 2004, 10:32:18
Ort: Stockholm

Re: Matlab-tråden

Inlägg 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?
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
snigelen
Inlägg: 815
Blev medlem: 8 maj 2009, 11:02:14
Ort: Lund

Re: Matlab-tråden

Inlägg 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.
Användarvisningsbild
Walle
Moderator
Inlägg: 7701
Blev medlem: 14 december 2004, 10:32:18
Ort: Stockholm

Re: Matlab-tråden

Inlägg 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)))
snigelen
Inlägg: 815
Blev medlem: 8 maj 2009, 11:02:14
Ort: Lund

Re: Matlab-tråden

Inlägg 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
Användarvisningsbild
Andax
Inlägg: 4379
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

Re: Matlab-tråden

Inlägg 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.
Användarvisningsbild
Walle
Moderator
Inlägg: 7701
Blev medlem: 14 december 2004, 10:32:18
Ort: Stockholm

Re: Matlab-tråden

Inlägg 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å?
JustNeed
Inlägg: 799
Blev medlem: 7 november 2007, 22:07:01
Ort: 08

Re: Matlab-tråden

Inlägg 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;
Användarvisningsbild
Walle
Moderator
Inlägg: 7701
Blev medlem: 14 december 2004, 10:32:18
Ort: Stockholm

Re: Matlab-tråden

Inlägg 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?
JustNeed
Inlägg: 799
Blev medlem: 7 november 2007, 22:07:01
Ort: 08

Re: Matlab-tråden

Inlägg av JustNeed »

Som två vektorer. :D

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.
snigelen
Inlägg: 815
Blev medlem: 8 maj 2009, 11:02:14
Ort: Lund

Re: Matlab-tråden

Inlägg 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.
Skriv svar