Verfasst am: 29.04.2015, 19:18
Titel: 3D Plot mit mehreren Matrizen
Hallo liebe Community!
Wie so viele hier habe ich auch meine Schwierigkeiten mit dem Plotten
Die Grundlagen des Plottens kenne ich, an den Feinheiten haperts aber noch.
Also folgendes Problem habe ich. Ich habe drei Matrizen, die jeweils mehrere Spalten und sehr viele Zeilen haben. Dabei ist der Großteil aller Werte leer (NaN), sodass in jeder Zeile immer nur ein Wert steht.
Das ganze sieht also etwa so aus:
MX1 = \begin{vmatrix} NaN & 1 & NaN \\ 1 & NaN & NaN \\ NaN & 100 & NaN \end{vmatrix}
MX2 = \begin{vmatrix} NaN & 2 & NaN \\ 10 & NaN & NaN \\ NaN & 3 & NaN \end{vmatrix}
MX3 = \begin{vmatrix} NaN & 4 & NaN \\ 7 & NaN & NaN \\ NaN & 27 & NaN \end{vmatrix}
Es soll jetzt so geplottet werden, dass jeweils die Spalten j der Matrizen die Koordinaten für die Punkte geben, also Spalte 1 von MX1 wird gegen Spalte 1 von MX2 und Spalte 1 von MX3 geplottet. Das gleiche für Spalte 2, 3, ... m. Da in jeder Zeile nur ein Wert steht, wird folglich für jede Zeile auch nur 1 Punkt generiert. Die Matrizen haben identische Dimensionen. Für jede Spalte soll eine andere Farbe verwendet werden, damit man im Plot nachher sehen kann aus welcher Spalte j der Punkt generiert wurde. Es wird also ein Pseudo-4D-Plot erstellt (Koordinaten aus XM1, XM2, XM3 und Farbkodierung für die Spalte). Für jede Spalte soll zudem ein farblich korrekter Legendeneintrag erzeugt werden.
Einen Beispielplot habe ich angehängt. Leider ist der Code der diesen Plot erzeugt hat, auf mein Problem nicht übertragbar (zu komplex).
Folgende Ansätze habe ich bereits verfolgt:
plot3(MX1, MX2, MX3) %erzeugt prinzipiell den richtigen Plot, verbindet aber alle Punkte über Linien; kann man hier vielleicht auch mit Punkten plotten?
scatter() %plottet nur Vektoren. Leider müsste ich hierzu meine Matrizen zerlegen, was ich eigentlich nicht möchte.
subplot könnte verwendet werden, um die Spalten alle einzeln zu plotten... es soll aber eigentlich alles in einen Plot.
Ich weiß, dass Matlab diverse surface-Plots darstellen kann, kenne mich hier aber gar nicht aus und weiß auch nicht, ob diese Funktionen den doch sehr speziellen Input, den ich habe, schlucken.
Hier jetzt der Code zum Problem: Achtung Laufzeit etwa 1 Minute (wegen ODE45), auf langsamen Rechnern länger. Input Parameter, falls es jemand bei sich laufen lassen will: t0 = 0, t = 20, x0=[0 0 0]', r= [10 6.5 -10]'; A = [-0.013 -0.05 -0.1; -0.01 -0.01 -0.09; 0.11 0.1 0.0], B= [0 0 0; 0.1 0 0; 0 0 0]
Code:
function[] = A1T3Copt( t0, t, x0, r, A, B )
%Ermittlung der Ruhelagen
syms x1 x2 x3;
[s1, s2, s3] = solve([x1 00; 0 x2 0; 00 x3] * (r + A * [x1 x2 x3]') + B * [x1 x2 x3]');
s1d = double(s1);
s2d = double(s2);
s3d = double(s3);
RL = [s1d s2d s3d];
AnzahlRL = length(RL(:,1))+ 1; %+1 um später Spalte einzuführen, in die geschrieben werden kann, wenn keine RL erreicht wird (simulierter Zeitraum zu kurz)
function[ dxdt ] = eLV_ODE( t, x, r, A, B )
%UNTITLED3 Summary of this function goes here
% Detailed explanation goes here
dxdt = diag(x) * (r + A * x)+ B*x;
bei plot3 kannst du als zusätzliches Argument die Linienart angeben. 'o' würde kreisförmige Marker erzeugen, '.' Punkte.
Falls die Statistics Toolbox verfügbar ist, würde ich gscatter empfehlen.
Ach ja, es bietet sich natürlich an, die Matrix dann dünn besetzt (sparse) abzuspeichern :)
Grüße,
Harald
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.