3D Darstellung aus Punkten < Matlab < Mathe-Software < Mathe < Vorhilfe
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 15:24 Mo 27.11.2006 | Autor: | Martin243 |
Hallo,
ist das eine "richtige" XLS-Datei oder "nur" eine CSV-Datei?
Gruß
Martin
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 08:23 Di 28.11.2006 | Autor: | CAS |
Hallo....
ist eine "richtige" xls.-Datei....
LG
|
|
|
|
|
Hallo,
eine "richtige" XLS-Datei kannst du ganz simpel importieren:
data = xlsread('Dateiname.xls');
Hier werden die Daten der ersten Tabelle dieser Datei in der Matrix data abgelegt.
Falls diese Datei mehrere Tabellen enthält, kannst du auch Folgendes machen:
data = xlsread('Dateiname.xls','Tabellenname');
Die Darstellung geschieht mittels plot3()-Funktion. Das kann man alles in eine Zeile schreiben, aber Schritt für Schritt geht das so:
xd = data(1:end,1); %x-Koordinaten extrahieren
yd = data(1:end,2); %y-Koordinaten extrahieren
zd = data(1:end,3); %z-Koordinaten extrahieren
plot3(xd,yd,zd,'.r'); %r=Rot, .=Darstellung als Punkt (sonst per Linie verbunden!)
Ich hoffe, als Einstieg reicht das.
Gruß
Martin
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 15:08 Di 28.11.2006 | Autor: | CAS |
Hallo...
hab das mal so notiert, aber leider kommt bei mir gleich der Fehler:
"
??? Index exceeds matrix dimensions.
Error in ==> einlesen at 3
xd = data(1:end,1); %x-Koordinaten extrahieren" :-(
Kannst du mir das erklären was dieser Ausdruck " xd = data(1:end,1);" im Einzelnen genau bedeutet?
LG Kathi
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 15:51 Di 28.11.2006 | Autor: | Martin243 |
Hallo,
kann es sein, dass deine data-Matrix leer ist. Ich nehme an, du hast die Zeilen in eine .m-Datei eingefügt. Da muss aber auf jeden Fall der xlsread-Befehl davorstehen, der der Matrix data den Datensatz aus deiner Datei zuweist.
xd = data(1:end,1);
Was der Ausdruck bedeutet:
Wir legen uns einen Vektor xd an, der unsere x-Koordinaten enthalten soll.
Die gesamte Datenmatrix wird über zwei Indizes angesprochen (in Matrix-Manier zuerst Zeile, dann Spalte).
Also ergibt data(4,2) das Element in der 4. Zeile und 2. Spalte.
Nun gibt es einige "Sonderindizes", die einen schnellen Zugriff auf ganze Teilmatrizen erlauben.
data(2:4,2:3) ergibt die Teilmatrix 2. bis 4. Zeile, 2. bis 3. Spalte.
data(5:end,1) ergibt die gesamte erste Spalte bis auf die ersten vier Elemente.
Also liest man mit data(1:end,1) die komplette erste Spalte der Matrix data aus, wo ich die x-Koordinaten vermutet habe.
Gruß
Martin
data()
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 10:34 Mi 29.11.2006 | Autor: | CAS |
Hallo Martin... mein Helfer in der Not,
Um ganz sicher zu sein, schicke ich dir das nochmal. Eingegeben habe ich also :
----------------------------------------------------------------
data = xlsread('x.xls');
xd = data(1:end,1); %x-Koordinaten
yd = data(1:end,2); %y-Koordinaten
zd = data(1:end,3); %z-Koordinaten
plot3(xd,yd,zd,'.r');
-----------------------------------------------------------------
und aus Sicherheitsgründen, habe ich die xls-datei auch noch angehängt....
Muss ich vorher noch was festlegen oder warum meckert mein Programm immer?
Grüße aus DD
[Dateianhang Nr. 1 (fehlt/gelöscht)]
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 11:21 Mi 29.11.2006 | Autor: | Martin243 |
Hallo,
ich verstehe es nicht! Ich habe die Datei gespeichert, deine Eingabe per Copy&Paste übertragen und bekomme:
[Dateianhang nicht öffentlich]
Kannst du mal die Semikolons hinter den Funktionsaufrufen weglassen? Am besten Stück für Stück. Schau dann mal, welche Werte data, xd, yd und zd annehmen.
Sonst bin ich im Moment ratlos.
Gruß
Martin
Dateianhänge: Anhang Nr. 1 (Typ: jpg) [nicht öffentlich]
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 07:37 Fr 01.12.2006 | Autor: | CAS |
hallo nochmal ....
wenn ich jetzt diese 3d-Punkte als Fläche sehe, bzw. als Körper, und jetzt noch eine Funktion darüberlegen möchte (einfache Addition quasi) wie muss ich da die Punkte bestimmen, bzw. geht das überhaupt, oder muss ich aus diesen Punkten eine andere Funktion erstellen?
LG
|
|
|
|
|
Hallo,
wenn du zu deinen Daten noch etwas dazuaddieren möchtest, dann kannst du das direkt machen, z.B.:
zd_neu = zd + sin(xd.*yd);
Beachte, dass die Addition (wie bei Matrizen) elementweise abläuft, für die elementweise Multiplikation aber ein Punkt vor dem Malzeichen stehen muss!
Du kannst natürlich auch vorher den anderen Summanden berechnen:
zd2 = sin(xd.*yd);
zd_new = zd + zd2;
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 10:31 Di 12.12.2006 | Autor: | CAS |
Hallo..... ;o)
habe noch mal eine Frage zu einer Darstellungsweise....
Habe einen 3d Körper (X, Y, Z) und jetzt will ich ein Quadrat (a,b,c) darüber legen. Soll dann später einen Bereich aus der Sicht (x,y) darstellen.
Mein Problem liegt jetzt beim Ausplotten:
Meine Schreibweise: ************************************
.....
figure
plot3(a,b,c);
surf(X, Y, Z);
*****************************************************
da wird aber nur (X,Y,Z) geplottet, wie bekomme ich nu die 2 "Grafiken" in ein Koordinatensystem unter.
LG
[Dateianhang Nr. 1 (fehlt/gelöscht)]
|
|
|
|
|
Hallo CAS,
dieses Problem tritt schon dann auf, wenn du versuchst, zwei Funktionen in ein Bild zu zeichnen, z.B. mit dem kurzen Programm
x=[0:pi/100:2*pi];
figure(1);
plot(x,sin(x));
plot(x,cos(x));
Hier hast du die Option, statt der beiden Plotbefehle
plot(x,sin(x),x,cos(x));
zu schreiben, aber das geht in deinem Fall nicht.
Du kann aber MATLAB anweisen, den alten Bildinhalt nicht zu ueberschreiben, indem du 'hold on' sagst, also im ersten Programm
x=[0:pi/100:2*pi];
figure(1);
hold on;
plot(x,sin(x));
plot(x,cos(x));
schreibst. So kannst du nacheinander verschiedene Grafikobjekte in dasselbe Bild zeichnen lassen.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 11:23 Di 12.12.2006 | Autor: | CAS |
Klappt wunderbar... dank dir dafür.....
LG Kathi
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 10:45 Fr 15.12.2006 | Autor: | CAS |
Hallo nochmal....
habe noch mal eine Frage zur Darstellung.
Die Punkte sollen als "Körper" dargestellt werden.... aber wenn ich Sie mir jetzt mit dem Befehl "plot3" ausgeben lasse, entsteht nur eine Punktwolke,
besser wäre es mit dem Befehl "surf", aber dies funktioniert nicht.
Wie kann ich mein Problem lösen?
[hab die Datei mal angehängt]
Datei-Anhang
Dateianhänge: Anhang Nr. 1 (Typ: xls) [nicht öffentlich]
|
|
|
|
|
Hallo,
wenn man weiß, wie groß das Gitter in deiner XLS-Datei ist, dann kann man es so versuchen:
data = xlsread('x.xls');
surf(reshape(data(:,1),61,63),reshape(data(:,2),61,63),reshape(data(:,3),61,63));
Hier sieht man in dem Plot noch einen hässlichen Sprung zwischen den positiven und den negativen x-Werten.
Wenn man auch dieses Problem beheben möchte, muss man die Daten noch nach den x-Koordinaten sortieren:
[st, ind] = sort(data,1);
surf(reshape(data(ind(:,1),1),61,63),reshape(data(ind(:,1),2),61,63),reshape(data(ind(:,1),3),61,63));
[Dateianhang nicht öffentlich]
Das kleine Loch in dem Plot ist wohl auf fehlerhafte Daten zurückzuführen.
Gruß
Martin
Dateianhänge: Anhang Nr. 1 (Typ: jpg) [nicht öffentlich]
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 13:57 Fr 15.12.2006 | Autor: | CAS |
klappt mal wieder..... danke ....
aber kannst du mir den Ausdruck:
surf(reshape(data(ind(:,1),1),61,63),reshape(data(ind(:,1),2),61,63),reshape(data(ind(:,1),3),61,63));
mal etwas näher erklären?
Meine eigentliche Exceltabelle umfasst 8000 Punkte und ich weis nicht ganz, was du meinst mit der Größe des Gitters in der XLS-Datei?
LG
|
|
|
|
|
Hallo,
die Tabelle, die du zuletzt mitgeliefert hattest, umfasste 3843 Punkte, die ein xy-Gitter von der Größe 61x63 beschrieben.
Also ging es darum, zuerst die x-Werte aufsteigend zu sortieren. Die Indizes der ursprünglichen Reihenfolge gab und de Funktion sort in dem Vektor ind zurück.
Da wir nach den x-Werten sortiert haben, interessiert uns nun nur die Indizes in ind(:,1).
Somit können wir auf die sortierten x-Wert zugreifen per data(ind(:,1),1),
auf die entsprechenden y-Werte per data(ind(:,1),2) und
auf die entsprechenden z-Werte per data(ind(:,1),3).
Die Funktion reshape macht aus den langen Vektoren mit 3843 Elementen Matrizen der Größe 61x63.
Du kannst dir mal die Hilfe zu surf ansehen, insbesondere für den Fall, dass X, Y und Z MATRIZEN sind.
Obiges funktioniert nur, weil die Annahme, dass deine XLS-Datei (bzw. die ersten beiden Spalten davon) ein Gitter beschreibt, stimmt. Sollte deine tatsächliche Datei ganz anders sein, dann müssten wir vielleicht umdenken.
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 08:04 Mo 18.12.2006 | Autor: | CAS |
... eigentlich ist sie nicht anders. Umfasst statt den 3843 Punkte 7686.
Man könnte doch jetzt sagen dass es ein XY- Gitter von 61x126 beschreibt, oder liege ich da falsch?
Wenn man das nämlich jetzt so wie oben schreibt mit reshape, zeigt es mir immer wieder einen Fehler an....
Woran liegt das?
Datei-Anhang
Dateianhänge: Anhang Nr. 1 (Typ: xls) [nicht öffentlich]
|
|
|
|
|
Hallo,
Excel und Matlab sagen aber beide, dass es nur 7873 Punkte sind. Da sind wohl ein paar zuviel...
Aaah, jetzt sehe ich es:
Das Gitter soll 61 * 125 Punkte groß sein und die Daten mit x= 29, 24, 22 und 21 sind doppelt. Werden die doppelten Daten gelöscht, kommen wir auf 7625 Punkte = 61*125.
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 14:34 Mo 18.12.2006 | Autor: | CAS |
...
hab das jetzt mal mit 61x125 genommen, doch leider kommt immernoch ein Fehler:
??? Error using ==> reshape
To RESHAPE the number of elements must not change.
Wo steckt da mein Fehler? Oder muss ich die Punkte doch auf andere Weise darstellen?
|
|
|
|
|
Moooment mal!
Vorher musst du natürlich deine Excel-Datei korrigieren. Schau mal genau hinein und lösche die doppelten Einträge (s.o.)
Erst, wenn die Datei genau die erforderliche Zeilenanzahl hat, funktioniert das reshape!
Gruß
Martin
|
|
|
|