Matlab 3d scatter plots

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Hallo allemaal :)

Ik ben bezig met een groot aantal simulaties af te werken in Simulink. Hierin varieer ik drie variabelen binnen een afgestelde range. Matlab itereert dus door de drie verschillende variabelen en gaat voor elke mogelijkheid een Simulink model simuleren.

Ik krijg hieruit een "efficientie getal". Ik sla die getal op in een 3d matrix, waarbij je efficiëntie E dus opslaat op positie (x, y, z). Nu wil ik hier een scatterplot van maken zodat je snel kan zien waar optima liggen. Ik kan de dots best filteren zodat het niet een dichte wolk wordt, maar zou graag een kleurverschil in de dots willen hebben. Ik kom er alleen niet uit!

Wel is het mogelijk om 3d plots te maken, dus een oppervlakte z=f(x,y) met z de efficiëntie en x,y twee gekozen variabelen. Je moet dus de derde variabelen vast zetten om dit te kunnen maken. En dat is natuurlijk niet handig.

Dingen als:
code:
1
scatter(x(:), y(:), z(:), data(:,1,1))
Ik krijg hiermee niet het gewenste resultaat, gezien je de tweede en derde dimensie vastzet. Als ik daar wel ":" neerzet krijg ik errors over mismatching dimensies. Hoe kan je dit wel netjes plotten :?

Acties:
  • 0 Henk 'm!

  • Noordvogel
  • Registratie: Juli 2007
  • Laatst online: 19-07-2024

Noordvogel

DPC @ DC-vault

Heb je voor x, y en z ook arrays met dezelfde dimensies als 'data'? Als x, y en z ook bestaan uit arrays met dimensies (x,y,z) dan kun je doormiddel van x( : ), y( : ) en z( : ) inderdaad een scatterplot maken:

code:
1
scatter3(x(:), y(:), z(:), 1, C);

Waarbij C een kleurmatrix (3, : ) die je hebt gebaseerd op de waarden van je data.

De functie scatter3 is de 3D equivalent van scatter. Misschien dat je daar ook iets aan hebt.

[ Voor 18% gewijzigd door Noordvogel op 20-10-2009 15:56 ]


Acties:
  • 0 Henk 'm!

  • Sallin
  • Registratie: Mei 2004
  • Niet online
Geen scatter, maar misschien nuttig: mesh?

This too shall pass
Debian | VirtualBox (W7), Flickr


Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Noordvogel schreef op dinsdag 20 oktober 2009 @ 15:53:
Heb je voor x, y en z ook arrays met dezelfde dimensies als 'data'? Als x, y en z ook bestaan uit arrays met dimensies (x,y,z) dan kun je doormiddel van x( : ), y( : ) en z( : ) inderdaad een scatterplot maken:

code:
1
scatter3(x(:), y(:), z(:), 1, C);

Waarbij C een kleurmatrix (3, : ) die je hebt gebaseerd op de waarden van je data.

De functie scatter3 is de 3D equivalent van scatter. Misschien dat je daar ook iets aan hebt.
Die manual heb ik dus gelezen, maar ik snap er nog weinig van :p Misschien moet ik even wat met een voorbeeldje illustreren:
code:
1
2
3
x = 0.1:0.1:1;
y = 1:1:10;
z = 10:10:100;
Dan heb ik op elk (x,y,z) coördinaat een kental. Bijvoorbeeld een formule als:
data = (x+y)^2 / z
Ik heb hier nu geen Matlab, geen idee of het zo werkt.

Het datapunt in (0.2, 3, 40) zou je dan gemakkelijk kunnen opvragen. Ik wil graag al de punten in "data" plotten in het x,y,z veld. Met bijv. het maximum rood t/m het minimum blauw :)
Sallin schreef op dinsdag 20 oktober 2009 @ 16:30:
Geen scatter, maar misschien nuttig: mesh?
Als ik zie wat een mesh is, lijkt het me niet wat ik bedoel:
Afbeeldingslocatie: http://arrowsmith510.asu.edu/matlab/Lectures/matlabfigs/mesh.jpg
Hier heb je dus een oppervlakte in een 3d ruimte. Ik heb juist op elk (x,y,z) punt een kental.

/edit: in ieder geval wel bedankt voor het meedenken natuurlijk :)

Acties:
  • 0 Henk 'm!

  • Sallin
  • Registratie: Mei 2004
  • Niet online
Ik heb nu niet matlab bij de hand, maar je zou dan eens kunnen zoeken op pcolor en varianten. Ik heb mesh gesuggereerd omdat het een 3d heatmap is. Als je dus kan uitvogelen hoe de heatmap werkt dan heb je er misschien iets voor jouw probleem aan. Bovendien staat er bij "doc mesh" misschien nog meer informatie naar 3d plots ed (onderaan meestal).

Verder zijn (complexe) 3d plaatjes niet altijd even lekker te interpreteren zonder dat je aan de figuur kan draaien en dergelijke. Als ik jou was zou ik ook eens kijken of je je visualisatie niet op een andere manier kan oplossen.

This too shall pass
Debian | VirtualBox (W7), Flickr


Acties:
  • 0 Henk 'm!

  • bomberboy
  • Registratie: Mei 2007
  • Laatst online: 12-09 02:47

bomberboy

BOEM!

Bedoel je iets als onderstaande voorbeeld? Vereiste voor die scatter3 is dat je samen met je datalijst een lijst van X, Y en Z vectoren hebt die elke punt in de datalijst dat moet geplot worden een locatie geeft.

Dit is dus eigenlijk wat Noordvogel zei:

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function [ ] = driedtest(  )

x = 0.1:0.1:1;
y = 1:1:10;
z = 10:10:100;

X = [];
Y = [];
Z = [];
data = [];

for i=1:length(x)
   for j=1:length(y)
       for k=1:length(z)
           data(i,j,k)=(x(i)+y(j))^2 / z(k);
           X(i,j,k) = i;
           Y(i,j,k) = j;
           Z(i,j,k) = k;
       end
   end
end
scatter3(X(:),Y(:),Z(:),50,data(:),'filled')


Waarschijnlijk kan dit alles veel efficiënter, maar ik vermoed dat dit wel ongeveer het type output is dat je wil?
Persoonlijk vind ik het wel niet de meest handige output om iets te interpreteren. O-)

[ Voor 47% gewijzigd door bomberboy op 21-10-2009 00:11 . Reden: Al een eerste optimalisatie tov mijn originele voorbeeldje, was immers heel inefficiënt ]


Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Sallin schreef op dinsdag 20 oktober 2009 @ 20:52:
Ik heb nu niet matlab bij de hand, maar je zou dan eens kunnen zoeken op pcolor en varianten. Ik heb mesh gesuggereerd omdat het een 3d heatmap is. Als je dus kan uitvogelen hoe de heatmap werkt dan heb je er misschien iets voor jouw probleem aan. Bovendien staat er bij "doc mesh" misschien nog meer informatie naar 3d plots ed (onderaan meestal).

Verder zijn (complexe) 3d plaatjes niet altijd even lekker te interpreteren zonder dat je aan de figuur kan draaien en dergelijke. Als ik jou was zou ik ook eens kijken of je je visualisatie niet op een andere manier kan oplossen.
Ik zal eens gaan kijken bij pcolor. Ik heb de handleiding er al op nageslagen, maar wellicht dat er nog meer in staat. En over het interpreteren: wat ik ook wil (maar dat is stap 2) is om meshes te maken van 2 variabelen vs. de efficiency. Het gaat om het maximum, dus ik wil bijvoorbeeld variabele #2 en #3 tegen elkaar uitzetten bij de waarde #1 waar de efficiency de hoogste is van de gehele dataset.

Ik moet alleen nog uitvinden hoe ik met find() de het (x,y,z) punt kan vinden waar het maximum is. Ik krijg nu allemaal vreemde resultaten terug :p
bomberboy schreef op dinsdag 20 oktober 2009 @ 23:59:
Bedoel je iets als onderstaande voorbeeld? Vereiste voor die scatter3 is dat je samen met je datalijst een lijst van X, Y en Z vectoren hebt die elke punt in de datalijst dat moet geplot worden een locatie geeft.

Dit is dus eigenlijk wat Noordvogel zei:

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function [ ] = driedtest(  )

x = 0.1:0.1:1;
y = 1:1:10;
z = 10:10:100;

X = [];
Y = [];
Z = [];
data = [];

for i=1:length(x)
   for j=1:length(y)
       for k=1:length(z)
           data(i,j,k)=(x(i)+y(j))^2 / z(k);
           X(i,j,k) = i;
           Y(i,j,k) = j;
           Z(i,j,k) = k;
       end
   end
end
scatter3(X(:),Y(:),Z(:),50,data(:),'filled')


Waarschijnlijk kan dit alles veel efficiënter, maar ik vermoed dat dit wel ongeveer het type output is dat je wil?
Persoonlijk vind ik het wel niet de meest handige output om iets te interpreteren. O-)
Jaaa, dat doe ik inderdaad! Ten minste, ik heb dus geen regels 7tm/9 en 16t/m18, maar hier komt het op neer. Ik ga het meteen proberen! :+

Het klopt inderdaad dat het niet het meest handige is om uiteindelijk te analyseren, maar ik wil het gebruiken om mensen die er minder verstand ervan hebben laten inzien hoe het werkt. Ik ga dus ook nog meshes maken met daarin het maximum (maar dan zit ik dus nog met find(), verwacht er alvast een topic over ;) ).

Acties:
  • 0 Henk 'm!

  • Sallin
  • Registratie: Mei 2004
  • Niet online
Je wilt het max uit data? Werkt dit dan niet:
Matlab:
1
puntje = max(max(max(data))); 


If A is a multidimensional array, max(A) treats the values along the first non-singleton dimension as vectors, returning the maximum value of each vector.

This too shall pass
Debian | VirtualBox (W7), Flickr


Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Sallin schreef op woensdag 21 oktober 2009 @ 10:16:
Je wilt het max uit data? Werkt dit dan niet:
Matlab:
1
puntje = max(max(max(data))); 


If A is a multidimensional array, max(A) treats the values along the first non-singleton dimension as vectors, returning the maximum value of each vector.
Ja, dat heb ik al ;) Maar nu gaat het om het coördinaat. Ik wil dus het (x,y,z) punt hebben waar het maximum zich bevindt. Ik kan nu dit doen:
code:
1
2
3
4
5
6
7
8
9
10
>> m=max(max(data));[m i] = max(m)

m =

   49.5765


i =

     2
Nu is 2 inderdaad de 2e waarde in de y-richting, daar waar het maximum zit, maar dan heb je nog niet de x en z. Maar het is nog wel wat lastiger, want er is een mogelijkheid dat je een lijn of een vlak van maxima krijgt. Zie bijvoorbeeld deze simulatie, nu met vijf stappen in elke richting:
Afbeeldingslocatie: http://i33.tinypic.com/219xgtu.png
Het maximum is voorlopig onafhankelijk van de z-as :)

Acties:
  • 0 Henk 'm!

  • Sallin
  • Registratie: Mei 2004
  • Niet online
Wil je perse de coordinaten weten of is het voldoende voor matlab om het te weten?
Als het het laatste is, dan kan je een logische array aanmaken met:
Matlab:
1
CoordMax = max(max(max(Data))) == Data;

en als je wilt weten of die uniek is:
Smerig:
Matlab:
1
2
3
4
test = sum(CoordMax(:));
if (test >= 2)
fprintf('niet uniek\n')
end

Netter, maar nog steeds niet briljant:
Matlab:
1
2
3
4
test = find (CoordMax(:) ==1)
if (length(test) >= 2 )
fprintf('niet uniek\n')
end


Matlab kan matrices zowel als matrixcoordinaat als als vector coordinaat aanroepen. Voor een 2x2 matrix kan dus zowel x(2,2) als x(4). Ook is het over het algemeen het snelst om gewoon met die logische dingen te werken in plaats van find te gebruiken.

[ Voor 8% gewijzigd door Sallin op 21-10-2009 14:08 ]

This too shall pass
Debian | VirtualBox (W7), Flickr


Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Ok, maar ik wil dus uiteindelijk óók mesh plots maken. Stel het maximum ligt (met die x, y, z van eerder) op (0.3; 6, 80). Dan wil ik dus een plot maken in het (x, y) vlak met data als oppervlakte. Dan is het natuurlijk wel handig z zo te kiezen dat het maximum van z op die oppervlakte ligt. Dus moet z 80 zijn.

Hetzelfde geldt voor een (y,z) vlak met x vastgezet op 0.3 en het (x,z) vlak met y op 6. Zie hier een screenshot van work in progress. Je ziet in de titles van de afbeeldingen staan dat ik dus de "missende dimensie" een bepaalde waarde geef. Hier is het gewoon de mediaan in de reeks, maar dat moet dus wat handiger (door de locatie van het maximum te weten).

Acties:
  • 0 Henk 'm!

  • Sallin
  • Registratie: Mei 2004
  • Niet online
Dus als ik je goed begrijp wil je van door jou bepaalde x en y het maximum van z vinden, of van x en z het max van y?
Waarom dan niet:
code:
1
max( data(x,y,:) ) % 1 element als x ook 1 element is

of
code:
1
max( data(x,:,:) ) % vector

This too shall pass
Debian | VirtualBox (W7), Flickr


Acties:
  • 0 Henk 'm!

  • Jovaro
  • Registratie: April 2005
  • Laatst online: 08-09 18:04
Je kan met max() ook een index terug krijgen:

code:
1
2
3
[zValue zIndex] = max(max(max(data)));
[yValue yIndex] = max(max(data(:,:,zIndex)));
[xValue xIndex] = max(data(:,yIndex,zIndex));


/edit: Je moet er natuurlijk wel rekening mee houden dat je meerdere indexen terug kan krijgen van max. Dat heb ik in de bovenstaande code niet gedaan.

[ Voor 27% gewijzigd door Jovaro op 21-10-2009 20:21 ]


Acties:
  • 0 Henk 'm!

  • Sallin
  • Registratie: Mei 2004
  • Niet online
Jovaro schreef op woensdag 21 oktober 2009 @ 20:18:
Je kan met max() ook een index terug krijgen:

code:
1
2
3
[zValue zIndex] = max(max(max(data)));
[yValue yIndex] = max(max(data(:,:,zIndex)));
[xValue xIndex] = max(data(:,yIndex,zIndex));


/edit: Je moet er natuurlijk wel rekening mee houden dat je meerdere indexen terug kan krijgen van max. Dat heb ik in de bovenstaande code niet gedaan.
Dat kan idd ook. In principe krijg je n-1 indices terug voor n dimensies (Matlab 2008). Voor twee dezelfde maximale getallen krijg je maar 1 index terug. Je zult dus nog met find oid moeten zoeken.
[Y,I] = MAX(X) returns the indices of the maximum values in vector I. If the values along the first non-singleton dimension contain more than one maximal element, the index of the first one is returned.

This too shall pass
Debian | VirtualBox (W7), Flickr


Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Ik kan hier (wederom) geen Matlab starten (iets met een licentieserver), maar morgen ga ik het weer proberen :p

Ik had al gespeeld met [m i] = max(data) en dergelijke, maar daar kreeg ik al vreemde resultaten uit. Dit probeerde ik met squeeze() weer wat leesbaarder te maken, maar dat viel niet echt mee :p De oplossingen van jullie (beide) zien er wat beter uit (thanks)! I'll let you know ;)
Pagina: 1