ich versuche mit 3D-Koordinaten einer Objekterkennung in Matlab zu arbeiten und Grafiken zu visualisieren. Die Daten sind in der Form [X-Wert Y-Wert Z-Wert] in einer Textdatei vorhanden. Leider komme ich in der "Programmierung" an meine Grenzen.
1. Wenn die Textdatei z.B. 500 Zeilen in der o.g. Form XYZ-Werte enthält, wie kann ich mir den Mittelwert pro Zeilenanzahl für X, für Y und für Z grafisch ausgeben lassen? Einzeln pro Koordinate oder aber auch alle Koordinaten in einem Diagramm. Das will bei mir einfach nicht funktionieren!
2. Wenn ich die Häufigkeit von Werten innerhalb der X-Werte visuell darstellen mag, ist sicherlich die hist()-Funktion von Vorteil. Allerdings bekomme ich einfach keine Grafik zustande. Auch hier wäre ich über einen Programmcode sehr dankbar. Ich bin ratlos und scheitere an den kleinsten Dingen in Matlab.
Es wäre auch sehr interessant zu wissen, wie ich dann bei der Mittelwertberechnung den Ergebnissen Farben zuweisen könnte, um so eine Grafik verständlicher zu visualieren.
Bsp. für X-Werte: Der Mittelwert pegelt sich von Zeilenanzahl zu Zeilenanzahl (Messanzahl) ja immer weiter ein. Dann wäre es super die ersten Mittelwertergebnisse die Farbe rot zuzuweisen. Dann würde man wissen das diese ersten Mittelwerte fern ab vom eigentlichen Mittelwert scheinen. Mit immer größer werdender Messanzahl (bis zu Zeile 500) würde ich dann gerne die Farbe "grün" für diese Ergebnisse im Diagramm bestimmen. Ganz nach dem Motto "rot" ist "schlecht" und "grün" ist "gut".
dein Problem klingt eher so, als gehörte es nach "Graphiken und Plots", nicht nach "Programmierung".
Zitat:
1. Wenn die Textdatei z.B. 500 Zeilen in der o.g. Form XYZ-Werte enthält, wie kann ich mir den Mittelwert pro Zeilenanzahl für X, für Y und für Z grafisch ausgeben lassen? Einzeln pro Koordinate oder aber auch alle Koordinaten in einem Diagramm. Das will bei mir einfach nicht funktionieren!
[...]
Bsp. für X-Werte: Der Mittelwert pegelt sich von Zeilenanzahl zu Zeilenanzahl (Messanzahl) ja immer weiter ein. Dann wäre es super die ersten Mittelwertergebnisse die Farbe rot zuzuweisen. Dann würde man wissen das diese ersten Mittelwerte fern ab vom eigentlichen Mittelwert scheinen. Mit immer größer werdender Messanzahl (bis zu Zeile 500) würde ich dann gerne die Farbe "grün" für diese Ergebnisse im Diagramm bestimmen. Ganz nach dem Motto "rot" ist "schlecht" und "grün" ist "gut".
Da musst du festlegen, ab wann der Farbwechsel passieren soll und die jeweiligen Teilstücke einzeln plotten:
Code:
X = rand(500,1);
Y = rand(500,1)*2 + 0.4;
mittelwerte_x = cumsum(X)./(1:500)';
mittelwerte_y = cumsum(Y)./(1:500)';
figure plot(X,'k-') hold on
plot(1:250,mittelwerte_x(1:250),'r-','LineWidth',3)% die ersten sind rot plot(250:length(mittelwerte_x), mittelwerte_x(250:end),'g-','LineWidth',3)% irgendwann gruen
Wie du dann jetzt die Werte für Y und Z übersichtlich in den gleichen Plot einfügen willst, ist mir nicht klar, aber das Prinzip ist natürlich für Y und Z gleich.
Zitat:
2. Wenn ich die Häufigkeit von Werten innerhalb der X-Werte visuell darstellen mag, ist sicherlich die hist()-Funktion von Vorteil. Allerdings bekomme ich einfach keine Grafik zustande. Auch hier wäre ich über einen Programmcode sehr dankbar. Ich bin ratlos und scheitere an den kleinsten Dingen in Matlab.
Vielleicht rufst du die hist()-Funktion mit Rückgabewerten auf? Dann kannst du das mit der bar()-Funktion visualisieren.
Code:
figure hist(X)% so kommt sofort ein plot [freqs, bins] = hist(X); % hier kriegst du nur die Werte und musst noch bar() anwenden bar(bins, freqs)
ich hatte auch erst in Thema "Grafiken" gehen wollen, bis ich mehrere Einträge bzgl. Koordinaten - und deren Matlab-Code für Grafiken immer in "Programmierung" gefunden habe...
Nun gut. Vielen Dank für die rasche Antwort. Die Codes werde ich die Woche mal ausprobieren und melde mich dann wieder
Bin momentan auf Dienstreise und habe nicht alle Dateien dabei. Was mir allerdings vorab schon auffällt: Wie kann ich "X" definieren? In der Datei selbst stehen ja nur Werte die mittels Leerzeichen getrennt sind (X-Wert Y-Wert Z-Wert). Womöglich mach ich schon beim Parsen Fehler? Wie definiere ich es also richtig, dass Matlab die X-Werte immer an der gleichen Stelle in der Datei findet, sodass ich im Code nur auf X oder hist(X) verweisen muss?
Daten einzulesen gehört tatsächlich hier hin. Ich hab nicht verstanden, dass es daran schon hapert. Wenn die Werte Leerzeichengetrennt sind, 3 Spalten haben und keinen Header, dann sollte es so gehen:
Code:
fid = fopen(filename, 'r');
out = textscan(fid, '%f %f %f');
out = cell2mat(out);
X = out(:,1); Y = out(:,2); Z = out(:,3);
Ahhh, Klasse! Jetzt kommt mehr Licht ins Dunkel Vielen Dank.
Auf ein paar Dateien habe ich gerade doch per Email Zugriff. Ein kleiner Header ist doch vorhanden. Demnach ist die Datei wie folgt aufgebaut:
Code:
[leerzeile]
Koordinaten
[leerzeile]
%ab hier (4. Zeile)sind dann wie beschrieben die XYZ-Werte
%Bsp. 500 Zeilen, danach folgen weitere (andere) Koordinaten mit dem gleichen Header
[leerzeile]
Koordinaten
[leerzeile]
%ab hier dann weitere 500 Zeilen Werte, etc.
Ich frage mich ob nun die Möglichkeit besteht nur 300 Zeilen aus jeder 500erKoordinaten auszulesen. Dem System sozusagen klarmachen, das mit dem Wort "Koordinaten" eine [leerzeile] folgt und danach die eigentlichen Werte gelistet sind. Auch wenn dann 500 Zeilen Werte folgen, sollen nur 300 Zeilen in die Berechnungen einfließen und automatisch zur nächsten Zeile "Koordinaten" springen um dort andere 300aus500 Werte zu nutzen.
Die verschiedenen Werte von X würden doch dann in einem plot visualisiert werden oder? Natürlich die Frage ob das so einfach geht?
mit fgetline() liest du von deiner Datei immer die nächste Zeile ein und kannst dann entscheiden, was damit passieren soll.
Die Idee: Wenn die Zeile mit dem Text "Koordinaten" beginnt, dann ignoriere noch eine weitereZeile (einfach ein weiteres fgetline() schreiben) und danach die nächsten 300 mal fgetline() verwenden und das Ergebnis der Zeile wegschreiben.
Anschließend wieder mit obiger Bedingung weiter machen (solange fgetline() benutzen, bis eine Zeile wieder mit dem Text "Koordinaten" beginnt...
Alternativ kannst du auch erst alle Spalten als Strings einlesen
und dann nachträglich in out{1} nach dem String "Koordinaten" suchen und immer danach die nächsten 300 Zeilen verwenden. Dann auf diese Werte eine str2num() und du solltest dein Ergebnis haben.
Ein Mittelweg aus beiden könnte hier beschrieben sein: http://www.mathworks.de/de/help/mat.....ort-large-text-files.html
Da musst du dann vermutlich den commentstyle anpassen (eventuell auf 'Koordinaten'), dann den folgenden Block mit 500 Zeilen mit textscan einlesen, davon aber nur die ersten 300 verwenden....
So oder so, ich glaube, dass du um etwas Frikkelei nicht herumkommst, da in deiner Datei einfach mehrere Datensätze mit Header aneinandergereiht sind - ich lasse mich aber gerne eine besseren belehren .
Auf jeden Fall Besten Dank und einen erholsame Festtage gewünscht
Grüße, der Roobi
_________________
Nutze den Tag
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.