Wie mache ich matlab klar, dass das alles zu variablen p_1 gehört? Alle meine bisherigen Versuche sind gescheitert. kann mir da wer weiterhelfen?
Danke!
Verfasst am: 21.01.2011, 13:20
Titel: Re: plot mit eval
Hallo Dose,
Zitat:
Hi ich versuche einen plot in einer Schleife mit eval zu programmieren. Auf eval kann ich dabei nicht verzichten.
Selbstverständlich kannst Du auf EVAL verzichten und hättest dann auch wohl keine Probleme, die Du hier posten müssest. Ich glaube Dir aber gerne, dass Du aus einem mir unbekannten Grund nicht auch EVAL verzichten möchtest.
Du könntest z.B. ganz problemlos die Variablen nicht "n_1", "n_2" und "p_1" etc bennenen, sondern als Index einen Index (!) benutzen: n{1}, n{2}, p{1} etc.
Zumindest solltest aber lediglich die Variablen per EVAL durchwursten, und den PLOT-Befehl ganz normal schreiben:
Ich würde aber ausgesprochen deutlich davon abraten: Allein die Tatsache, dass Du hier postest, zeigt, dass der EVAL-Ansatz einfach nur unnötige Probleme schafft. Man kann Programme ja auch einfach mal einfach, übersichtlich, effizient und leicht debugbar ohne EVAL formulieren.
@Jan: Vielen Dank auch für deine Antwort. Diese Lösung ist natürlich schöner, aber ich wüsste nicht wie ich auf eval verzichten kann.
Der Grund warum ich eval nutze, ist dass ich einzelne Elemente aus einer Matrix löschen will. Das geht ja nun mal nicht, weshalb ich mir die Matrix in Vektoren zerlege. Da die Matrix aber immer unterschiedliche Dimensionen hat, muss das ganze in einer Schleife unabhängig der Matrix Dimension klappen. Und mit eval war das meine einzige und auch funktionierende Idee. Nur beim Plotten hatte ich dann auf einmal Probleme, die ja nun gelöst sind.
Der Grund warum ich eval nutze, ist dass ich einzelne Elemente aus einer Matrix löschen will. Das geht ja nun mal nicht, weshalb ich mir die Matrix in Vektoren zerlege. Da die Matrix aber immer unterschiedliche Dimensionen hat, muss das ganze in einer Schleife unabhängig der Matrix Dimension klappen. Und mit eval war das meine einzige und auch funktionierende Idee.
Wenn es funktioniert, ist es gut.
Eine alternative zu EVAL zu suchen, lohnt sich aber immer. Statt "n_1" einfach "n{1}" zu schreiben geht auch in einer Schleife mit variabler Länge sehr gut, einfach und sicher.
Du kannst übrigens einzelne Werte aus eine Matrix löschen, wenn Du sie zuerst in einen Vektor verwandelst: "v = M(:)".
Vielleicht möchtest Du auch den Teil posten, der die Elemente lösch? Dann könnten wir Dir eventuell ein paar hübsche Vereinfachungen zeigen, die Dir den Gebrauch von EVAL madig machen.
Ohh man. Klar mit einem Array wäre das natürlich auch gegangen. Aber nun ja, jetzt funktioniert es und ich werde erstmal weiter machen, bevor ich damit anfange es schöner zu programmieren.
Aber vielen Dank für das Angebot, vielleicht komme ich ja nochmal darauf zurück. Ich werde wohl noch länger an der Aufgabe sitzen^^
Danke!
Hallo Jan,
da ich nun meinen plot doch noch überarbeite, habe ich deinen Rat angenommen und auf den Befehl eval verzichtet und arbeite nun mit einem array.
Mein neues Problem ist nun, dass ich eine zweite x-Achse benötige.
Bisher sieht es bei mir so aus:
Code:
Darstellung = {'-k'; '-g'};
for i = 1:2
p{i}=plot(x-Wert{i}, y-Wert{i}, char(Darstellung(i)), 'LineWidth', 2);
end xlabel('x-Achse');
ylabel('y-Achse');
hmm danke, aber damit komme ich nicht weiter.
Zum einen will ich keine zweite y-Achse, zum anderen habe ich zu jeder Achse unterschiedlich lange Vektoren, die ich in einem char array zusammen gefasst habe. Ich komme nicht darauf wie ich das dann genau machen muss.
In der Zwischenzeit hatte ich probiert das ganze dann doch mit zwei y-Achsen und einer x-Achse zu machen, da ich hier den Befehl plotyy nutzen kann. Aber hier komme ich auch nicht zurecht. Bei meinem Versuch werden die Achsen mehrfach versetzt geplottet. Wie kann ich das lösen?
In style(i) und color(i) stehen einfach nur die Verschiedenen Strichtypen. Spreche ich AX auch als char an, also z.B. AX{i}(1), dann kommt die Fehlermeldung: Cell contents reference from a non-cell array object.
Spreche ich AX auch als char an, also z.B. AX{i}(1), dann kommt die Fehlermeldung: Cell contents reference from a non-cell array object.
AX ist ein [1 x 2] DOUBLE Vektor. Ihn "als CHAR anzusprechen" ist nicht möglich, was immer das auch bedeuten mag. Die geschweiften Klammern referenzieren ein Cell Array. Du bräuchtest also wahrscheinlich "AX(1)" und "AX(2)".
Gruß, Jan
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.