Permalänk
Medlem

MATLAB Problem

Hej,

Jag håller på med mitt examensarbete och har stött på ett litet hinder. Jag ska nämligen simulera ett x antal scenario i Matlab. För att veta vad jag behöver simulera måste jag ta fram alla möjliga, unika, kombinationer av mina parametrar. Är det någon som vet hur jag ska göra.

Jag har 4 parametrar som alla kan ha olika värden.

Parameter 1: från 0-120 med ett tidssteg (121 punkter)
Parameter 2: från 0-2 med 0.1 tidssteg
Parameter 3: från 0-3 med 0.1 tidssteg
Parameter 4: från 0-2 med 0.1 tidssteg

Jag vill alltså ha ut en matris som tar fram alla möjliga kombinationer av dessa fyra parametrar.

Permalänk
Medlem

Lite morgontrött och snurrig, men låter som du vill/borde göra (reducerat) faktorförsök ?

http://en.wikipedia.org/wiki/Fractional_factorial_design

Det finns program som kan sätta upp en sån matris åt dig, tror generella namnet är "Design of experiments (DOE)" program.

Permalänk
Medlem
Skrivet av Rashbalt:

Lite morgontrött och snurrig, men låter som du vill/borde göra (reducerat) faktorförsök ?

http://en.wikipedia.org/wiki/Fractional_factorial_design

Det finns program som kan sätta upp en sån matris åt dig, tror generella namnet är "Design of experiments (DOE)" program.

Finns alltså inget inbyggt kommando i Matlab för det? Utan jag behöver ett externt program?

Permalänk
Medlem

Är inte det där Monte Carlo simulering?
Skriv parametrarna som vektorer och sedan kör vektorberäkning på allt. Men borde bli problem eftersom de har olika längd...

Permalänk

Det är inte överdrivet svårt att göra beräkningarna för ett faktorförsök själv, men det kräver ju lite inläsning. Jag skulle gissa att du i vilket fall behöver visa hur du gjort detta i din rapport så det kan vara värt att sätta sig in i hur det fungerar hur som helst.

Permalänk
Medlem

Okej, om jag gör alla fyra vektorer lika långa. Skulle det förenkla det hela?
Alltså jag vet att man kan göra något sådant med funktionen "permutation" nchoosek" men förstår inte riktigt hur jag ska använda dom när jag har 4 vektorer.

Permalänk

Skulle du inte bara kunna använda dig av fyra for loopar? Det borde väl vara det enklaste att ha en loop för varje variabel och sedan dina beräkningar i den innersta loopen.

Permalänk
Medlem
Skrivet av SuperSunken:

Skulle du inte bara kunna använda dig av fyra for loopar? Det borde väl vara det enklaste att ha en loop för varje variabel och sedan dina beräkningar i den innersta loopen.

Själva beräkningen kommer att genomföras via Simulink. Jag behöver bara receptet för vilka körningar jag behöver göra.

Permalänk
Medlem
Skrivet av DjuDju:

Finns alltså inget inbyggt kommando i Matlab för det? Utan jag behöver ett externt program?

Reducerade faktorförsök klarar matlab bara av i 2 nivåer med fracfact.

Du skulle nog kunna göra det till fullfaktorförsök med fullfact, men riskerar bli rätt beräkningstungt att utföra sen.

Skrivet av Julgransfoten:

Det är inte överdrivet svårt att göra beräkningarna för ett faktorförsök själv, men det kräver ju lite inläsning. Jag skulle gissa att du i vilket fall behöver visa hur du gjort detta i din rapport så det kan vara värt att sätta sig in i hur det fungerar hur som helst.

Naturligtvis det bästa, lär väl finnas en matematikinstution som kan hjälpa till ?

Skrivet av SuperSunken:

Skulle du inte bara kunna använda dig av fyra for loopar? Det borde väl vara det enklaste att ha en loop för varje variabel och sedan dina beräkningar i den innersta loopen.

Risk att även detta blir rätt beräkningstungt ?

Permalänk
Medlem

Jag har hittat något....

v=unique(nchoosek(repmat([0 2 4 6 8 10], 1,6), 3), 'rows')

Denna funktion ger alla möjliga kombinationer av 3 vektorer med värden mellan (0 och 10).

Hur ska jag modifiera den så att jag kan ange 4 olika, men lika långa, vektorer. Någon som har en idé?

Permalänk
Hedersmedlem
Skrivet av DjuDju:

Hej,

Jag håller på med mitt examensarbete och har stött på ett litet hinder. Jag ska nämligen simulera ett x antal scenario i Matlab. För att veta vad jag behöver simulera måste jag ta fram alla möjliga, unika, kombinationer av mina parametrar. Är det någon som vet hur jag ska göra.

Jag har 4 parametrar som alla kan ha olika värden.

Parameter 1: från 0-120 med ett tidssteg (121 punkter)
Parameter 2: från 0-2 med 0.1 tidssteg
Parameter 3: från 0-3 med 0.1 tidssteg
Parameter 4: från 0-2 med 0.1 tidssteg

Jag vill alltså ha ut en matris som tar fram alla möjliga kombinationer av dessa fyra parametrar.

Låter spontant som en kartesisk produkt.

Går att fiffla ihop med loopar:

A = [0:120]; B = [0:.1:2]; C = [0:.1:3]; D = [0:.1:2]; S = zeros(length(A)*length(B)*length(C)*length(D), 4); i = 1; for a = A for b = B for c = C for d = D S(i,:) = [a b c d]; i = i+1; end end end end

S ska nu innehålla alla kombinationer (tar någon sekund på en relativt slö laptop, enligt tester). Notera att det kan bli en massiv matris beroende på hur många kombinationer som stoppas in; räkna på ca 8 B per double, vilket i ditt fall ger en S-matris på ~50 MB, vilket bör vara hanterbart. Ifall detta är en begränsning så lagra cellerna som singles (tar halva platsen) eller till och med heltal i stället (tar ner till en åttondel av platsen), med lite ändringar i koden. Se till att förallokera S-matrisen ovan, annars går det ordentligt slött.

Ett alternativ är att använda färdig kod. Det verkar inte som att det finns någon klockren inbyggd funktion, vilket är lite lustigt, men AllComb lär funka.

Notera också att om du inte har någon egentlig anledning att lagra värdena så kan du köra funktionen direkt i loopen. Ifall det blir totalt stopp i prestandan så kan man gå vidare och parallellisera det bättre, men ifall det inte behövs så behöver man inte alltid vara "smart i onödan".

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Permalänk
Medlem
Skrivet av phz:

Låter spontant som en kartesisk produkt.

Går att fiffla ihop med loopar:

A = [0:120]; B = [0:.1:2]; C = [0:.1:3]; D = [0:.1:2]; S = zeros(length(A)*length(B)*length(C)*length(D), 4); i = 1; for a = A for b = B for c = C for d = D S(i,:) = [a b c d]; i = i+1; end end end end

S ska nu innehålla alla kombinationer (tar någon sekund på en relativt slö laptop, enligt tester). Notera att det kan bli en massiv matris beroende på hur många kombinationer som stoppas in; räkna på ca 8 B per double, vilket i ditt fall ger en S-matris på ~50 MB, vilket bör vara hanterbart. Ifall detta är en begränsning så lagra cellerna som singles (tar halva platsen) eller till och med heltal i stället (tar ner till en åttondel av platsen), med lite ändringar i koden. Se till att förallokera S-matrisen ovan, annars går det ordentligt slött.

Ett alternativ är att använda färdig kod. Det verkar inte som att det finns någon klockren inbyggd funktion, vilket är lite lustigt, men AllComb lär funka.

Notera också att om du inte har någon egentlig anledning att lagra värdena så kan du köra funktionen direkt i loopen. Ifall det blir totalt stopp i prestandan så kan man gå vidare och parallellisera det bättre, men ifall det inte behövs så behöver man inte alltid vara "smart i onödan".

Grymt, Tack!! Precis vad jag letade efter.

Möjliga kombinationer = 1,6 miljoner:O