WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

plot mit eval

 

dose
Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 21.01.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.01.2011, 10:56     Titel: plot mit eval
  Antworten mit Zitat      
Hi ich versuche einen plot in einer Schleife mit eval zu programmieren. Auf eval kann ich dabei nicht verzichten.
Mein Ansatz:
Code:
m_1=100; n_1=30;
    Darstellung = {'--g'; ':r'};
    LineWidth={'LineWidth'};
for j = 1:1
    eval(['p' num2str(j) '= plot(m_' num2str(j) ', n_' num2str(j) '), Darstellung(' num2str(j) '), LineWidth, 3' ])    
end

nun kommt es aber zu der Ausgabe:
Code:
p1 =
  171.0217
ans =
    '--g'
LineWidth =
    'LineWidth'
ans =
     3

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!
Private Nachricht senden Benutzer-Profile anzeigen


Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.01.2011, 11:18     Titel:
  Antworten mit Zitat      
Code:

eval(['p',num2str(j),'= plot(m_',num2str(j),', n_',num2str(j),',','''',char(Darstellung(j)),'''',', ''LineWidth'', 3);' ])
 



so?
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 21.01.2011, 13:20     Titel: Re: plot mit eval
  Antworten mit Zitat      
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:

Code:
m_1=100; n_1=30;
for j = 1:1
  m = eval(sprintf('m_%d', j);
  n = eval(sprintf('n_%d', j);
  p = plot(m, n, Darstellung{j}, 'LineWidth', 3);
  eval(sprintf('p_%d = p));
end
 

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.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
dose
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 21.01.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.01.2011, 13:48     Titel:
  Antworten mit Zitat      
@Thomas84: vielen Dank, so geht es!

@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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 21.01.2011, 14:04     Titel:
  Antworten mit Zitat      
Hallo dose,

Zitat:
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.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
dose
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 21.01.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.01.2011, 14:19     Titel:
  Antworten mit Zitat      
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!
Private Nachricht senden Benutzer-Profile anzeigen
 
dose
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 21.01.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.03.2011, 17:23     Titel:
  Antworten mit Zitat      
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');
 

Wie kann ich nun einen weiteren plot mit einer 2. x-Achse hinzufügen?
Vielen Dank
Private Nachricht senden Benutzer-Profile anzeigen
 
Peter Quint
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 95
Anmeldedatum: 21.02.11
Wohnort: Lübeck
Version: R2010b
     Beitrag Verfasst am: 01.03.2011, 17:58     Titel:
  Antworten mit Zitat      
Code:

achsen1= gca;
achsen2= axes('Position',get(achsen1,'Position'),...
           'XAxisLocation','top',...
           'YAxisLocation','right',...
           'Color','none',...
           'XColor','k','YColor','k');

plot(x2,y2, 'Parent',achsen2);
 


Damit hast Du eine neue X- und Y-Achse oben und rechts.
Private Nachricht senden Benutzer-Profile anzeigen
 
dose
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 21.01.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.03.2011, 15:16     Titel:
  Antworten mit Zitat      
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?
Code:

for i= 1:10
    [AX,H1,H2] = plotyy(x-Wert{i}, y1-Wert{i}, x-wert{i}, y2-Wert{i},'plot');
set(AX,'FontSize',11,'YColor','k');
set(get(AX(1),'Ylabel'),'FontSize',11);
set(get(AX(2),'Ylabel'),'FontSize',11);
set(H1,'LineStyle',char(style(i)), 'color', char(color(i)), 'linewidth',2);
set(H2,'LineStyle',char(style(i)), 'color', char(color(i)), 'linewidth',2);
end
 

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.

Danke
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 03.03.2011, 00:22     Titel:
  Antworten mit Zitat      
Hallo Dose,

Es scheint eine Verwirrung um Cells zu geben.
Code:
char(style(i))
% Besser:
style{i}


Zitat:
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.