Toon posts:

[Matlab] Een plot opslaan om constant weer te blijven geven?

Pagina: 1
Acties:

Onderwerpen


  • job_h
  • Registratie: Augustus 2005
  • Laatst online: 26-05 20:05
Goedennacht,

Ik ben momenteel bezich met een project voor mijn opleiding. We hebben de opdracht gekregen om het verkeer in een binnenstad van een Nederlandse stad te simuleren.
Nu hebben we ervoor gekozen om dit in matlab te programmeren, omdat we veel met vectors werken en matlab daar vrij vlot mee is.

Nu is het ook de bedoeling dat we het wegennetwerk weer geven en daarop de auto's die eroverheen rijden. Ongeveer 60% van de tijd die het programma nodig heeft gaat in het weergeven van de wegen en auto's zitten, terwijl de wegen en voertuigen enkel lijnen zijn met een ander kleurtje. We kunnen het natuurlijk 1 keer per 10 interaties laten plotten, maar dat is niet de oplossing die we zoeken.

Nu hebben we uiteraard bedacht dat het wegenstelsel maar één keer geplot hoeft te worden, maar iedere keer dat we de auto's plotten, moeten we het hele venster verversen, want anders verplaatsen de auto's zich niet, maar krijg je een lange lijn op de plaatsen waar de auto's zijn geweest.

De vraag:
Is het mogelijk om een plot te maken, die (eventueel tijdelijk) op te slaan en deze weer te geven zonder iedere keer iedere weg apart opnieuw te plotten?

We hebben tot nu toe het volgende geprobeerd:
1. Het wegennetwerk plotten, de plot exporteren als png en de png gebruiken als background terwijl we de auto's er transparant overheen plotten.
Dit was veelbelovend, maar ik ben tegen een aantal rare problemen opgelopen... Zo draaide hij opeens de Y as om zodra ik het png bestand ging gebruiken, rektte hij het png bestand niet goed uit tot de grootte van het venster en kwam er om het wegennetwerk een witte rand te staan die niet bij de plot hoorde.
Als iemand weet hoe we een plot op kunnen slaan en weer weer kunnen geven, deze oplossing heeft onze voorkeur :)

2. OpenGL gebruiken voor de plots, zodat het sneller gaat.
Maar dit leverde geen opzienbarende snelheidsverbetering op

3. Parallel de auto's en wegen plotten
Ook deze aanpak leverde weinig resultaat op, het scheelde slechts een paar procenten. Terwijl mijn cpu belasting niet boven de 15% stijgt en per core komt hij niet hoger dan 70% (quadcore met hyperthreading).

Ik hoop dat iemand ons kan helpen! :)

[Voor 1% gewijzigd door .oisyn op 20-04-2017 12:45]


  • Armageddon_2k
  • Registratie: September 2002
  • Laatst online: 13:39

Armageddon_2k

Trotse eigenaar: Yamaha R6

Gooit even wat ideetjes neer:

Je zou kunnen gaan werken in verschillende Layers (LayerPlot).

Of je kan alles wat je hebt geplot en wat je wilt refreshen (de auto's) deleten.
Waarschijnlijk doe je nu iets in de trand van:
Plot(autootje)
Wat je kan doen:
H = Plot(Autootje)
Waarna je Delete(H) kan doen,

Je kan ook even moeten kijken naar EraseMode.
Once you have the handle to the line, you can set the erasemode to
'background' or 'xor', depending on the effect you want. You can also
pass these options directly to the PLOT command:

h=plot(x,y,'erasemode','background')

This is more efficient than manually deleting and creating the line at
each iteration.

Inside the loop you can update the 'xdata' and 'ydata' instead of
doing a complete replot; this will provide a much smoother
"animation".

The "Using MATLAB Graphics" manual that ships with MATLAB 5 discusses
these issues in more detail.

[Voor 45% gewijzigd door Armageddon_2k op 28-06-2011 09:20]


  • mithras
  • Registratie: Maart 2003
  • Niet online
Eerste gok: als je de plot opslaat als een Matlab figure? Dat zou kunnen met saveas en open.

Tweede optie is om te werken met GUI waardoor je geavanceerdere mogelijkheden krijgt om interfaces te bouwen en dynamische plots te maken.

  • job_h
  • Registratie: Augustus 2005
  • Laatst online: 26-05 20:05
@Armageddon_2k
Je zou kunnen gaan werken in verschillende Layers (LayerPlot).
Zal eens uitzoeken of dat zou werken.
Of je kan alles wat je hebt geplot en wat je wilt refreshen (de auto's) deleten.
Dit idee was ik inderdaad al eerder tegen gekomen, maar we worden geacht Object Oriented te programmeren (ja ik weet dat matlab daar niet super voor is :p). De main method loopt en bij iedere iteratie wordt plotroad en plotvehicles aangeroepen voor elke afzonderlijke straat.
Als ik iets kan doen als H = H + plotvehicles(road146) zou het wel kunnen werken, maar dat ga ik zo even testen.
Je kan ook even moeten kijken naar EraseMode.
Ook al tegengekomen ja, weet niet helemaal zeker of we het al geprobeerd hadden... Zal ik dadelijk ook doen.

@mithras
Eerste gok: als je de plot opslaat als een Matlab figure? Dat zou kunnen met saveas en open.
saveas heb ik al geprobeerd, nadeel was dat ik een PNG bestand kreeg met ongeveer een centimeter aan witte randen aan de zijkanten...
Tweede optie is om te werken met GUI waardoor je geavanceerdere mogelijkheden krijgt om interfaces te bouwen en dynamische plots te maken.
Als de bovenstaande tips niet werken zal ik ook daar eens naar kijken ;)

Bedankt allen! Ik laat nog weten of het gewerkt heeft.

  • Bozozo
  • Registratie: Januari 2005
  • Laatst online: 27-05 08:52

Bozozo

Your ad here?

Erasemode heb je niet zoveel aan... dan plot je gewoon een lijn in de achtergrondkleur over de oude lijn. Als je achtergrond een complexe afbeelding is werkt dat niet.

Ik heb dit een tijdje geleden opgelost met een dubbele as. De onderste bevat de afbeelding, de bovenste krijgt de plotjes.

Matlab:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    % Get imgfile path
    [file,path] = uigetfile({'*.jpg;*.jpeg;*.png;*.bmp;*.gif','Image (*.jpg,*.png,*.bmp,*.gif)';'*.*',  'All Files (*.*)'},'Choose file');
    imgpath = fullfile(path,file);    
   
    % Read image, scale colormap, and plot
    imagesc(imread(imgpath));
    axis off;
    
    % Create new axes over the figure
    axes('position',get(gca,'position'));
    
    % Do stuff and plot the result with a transparent background
    for i = 1:10
       x = 0:0.01:1;
       y = rand(1, length(x));
       plot(x,y);
       set(gca,'color','none');
       pause(1);
    end


Overigens is het netter om de state van je systeem na elke stap op te slaan (desgewenst na x iteraties vereenvoudigd weergeven), en het renderen uit te stellen tot na de simulatie.

TabCinema : NiftySplit


  • pyther
  • Registratie: Juli 2004
  • Laatst online: 26-05 07:59
Heb even snel iets geprobeerd:

Matlab:
1
2
3
4
5
6
figure
plot([1 9 9 1 1], [1 1 9 9 1], 'k') % 'wegennet'
xlim([0 10]), ylim([0 10])
hold on
h_car = plot([2 3], [2 2], 'r');
set(h_car, 'XData', [3 4]) % object behouden, XData en/of YData aanpassen


misschien heb je er iets aan.
Tweede optie is om te werken met GUI waardoor je geavanceerdere mogelijkheden krijgt om interfaces te bouwen en dynamische plots te maken.
Ik ben er vrij zeker van dat er niet 'geavanceerde mogelijkheden' bestaan betreffende plotten wanneer je een GUI gebruikt. Een GUI in matlab is immers gewoon een figure. Corrigeer me maar als ik het mis heb :)

[Voor 39% gewijzigd door pyther op 29-06-2011 21:42]


Acties:
  • 0Henk 'm!

  • ValHallASW
  • Registratie: Februari 2003
  • Niet online
Allereerst: dat je png 'op de kop staat' is niet vreemd; dat heeft ermee te maken dat het nulpunt van de y-as niet goed gedefinieerd is (iaw: begin je boven of beneden met tellen?). Daar heb je ongetwijfeld een inleesoptie voor, en anders kan je je array op de kop zetten. Randen wegsnijden zou ook niet al te moeilijk moeten zijn, zou ik zeggen...

Andere optie: wegen elke n frames refreshen en de lijntjes die je dan tijdelijk hebt voor lief nemen.

En als laatste een veel basalere vraag: Is het niet een optie om de afbeeldingen tijdens de simulatie weg te schrijven en er later een filmpje van te maken? Ik snap niet zo goed waarom je die afbeeldingen /tijdens/ je simulatie wilt hebben.
edit: wat bozozo zegt dus

  • TheWickedD
  • Registratie: Juli 2002
  • Laatst online: 11-03 21:01
Je hoeft de plot niet eerst op te slaan naar png, met wat truucjes kun je hem meteen als matrix krijgen, waarna je hem weer kunt plotten met image() (eventueel in een overlappende assen zoal Bozozo aangeeft als je axis ij moet gebruiken om het geheel in de juiste orientatie te krijgen).

Kijk naar imcapture (http://mirone.googlecode....s/1.3.0/utils/imcapture.m, het lijkt erop dat the mathworks het van hun file exchange heeft weggehaald).

roep bijvoorbeeld zo aan:
imcapture(fhndl,'img',[yres xres])
om het geheel zonder randen te krijgen.
Pagina: 1


Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee