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

Fehler im "subplot" Befehl mit einer for-Schleife

 

Homer687
Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 03.08.10
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 09.08.2010, 10:13     Titel: Fehler im "subplot" Befehl mit einer for-Schleife
  Antworten mit Zitat      
Hallo alle zusammen,

ich habe folgendes Problem.
Ich möchte in einem subplot Befehl eine for-Schleife programmieren. Aber leider bekomme ich mit meiner for-Schleife nicht die selbe Grafische Ausgabe als ohne for-Schleife.

Kann mir vielleicht jemand helfen, wo da mein Fehler liegt.
Anbei mein Code ohne und mit for-Schleife.


Code:

subplot('Position',[0.4 0.82 0.2 0.15])  % x-Achse, Y-Achse, breite, höhe
bar(-[s106 s107 s108 s109 s110 s111],0.3), title ('Beispiel');
grid on    % schaltet ein Hintergrundgitter ein
 


jetzt mit for-Schleife

Code:

subplot('Position',[0.4 0.82 0.2 0.15])  % x-Achse, Y-Achse, breite, höhe
for i=106:111
bar(-['s' num2str(i)],0.3), title ('Beispiel');
end
grid on    % schaltet ein Hintergrundgitter ein
 


Vielen Dank für Eure Hilfe
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: 09.08.2010, 15:15     Titel: Re: Fehler im "subplot" Befehl mit einer for-Schle
  Antworten mit Zitat      
Hallo Homer,

Homer687 hat Folgendes geschrieben:
Code:

subplot('Position',[0.4 0.82 0.2 0.15])  % x-Achse, Y-Achse, breite, höhe
for i=106:111
bar(-['s' num2str(i)],0.3), title ('Beispiel');
end
grid on


"['s' num2str(i)]" ist ein String, also ein CHAR Vektor in Matlab. Wenn man damit Operationen ausführt, wie z.B. das unäre Minus, wird das CHAR Array automatisch in ein DOUBLE Array umgewandelt. Siehe:
Code:

Du suchst aber nicht den String ['s' num2str(i)], sondern den Inhalt der Variable dieses Namens. Zwar kommt man daran per EVAL Funktion.

Da es nun meine Bestimmung zu sein scheint, täglich von EVAL abzuraten, werde ich auch heute dieser Tradition treu bleiben:
Statt die Variablen mit verschiedenen Namen zu erstellen, könntest Du sie gleich entweder in eine Matrix, Struct oder in ein CELL Array packen. Eine Anhäufung verschiedener Variablen im Nachhinein über den Variablen-Namen mit einer inneren Struktur zu versehen, ist kein effizienter Programmierstil. Das ist vergleichbar damit, Schülern ihren Stundenplan als Nachnamen zu geben, oder Lebensmittel im Supermarkt mit ihrem Preis zu benennen. Beides würde natürlich funktionieren, aber der Nachteile des Mischens zwischen Daten-Struktur und Daten-Wert ist eine exponentiell steigende Programm-Komplexität.

Nebenbei wird in Deiner FOR Schleife der Title immer wieder neu geschrieben und der Plot auch jedesmal überschrieben. Wahrscheinlich ist das nicht beabsichtigt, oder?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 03.08.10
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 09.08.2010, 15:59     Titel:
  Antworten mit Zitat      
Hallo Jan,

vielen Dank für Deine Antwort.

Vielleicht kannst Du heute mal eine Ausnahme machen und diesmal nicht von EVAL abraten, denn ich weiß in Moment gerade nicht weiter. Wie kann ich den mit EVAL in meinen Bsp. auf meine Variablen zugreifen?
So gut bin ich in nicht MATLAB, so das ich mein ganzes Programm effizienter schreiben kann. Aber Du hast recht, eine Anhäufung verschiedener Variablen im Nachhinein über den Variablen-Namen mit einer inneren Struktur zu versehen, ist kein effizienter Programmierstil.

Ich weiß das der der Title immer wieder neu geschrieben wird, aber das ist in diesem Bsp. so gewollt, da ich mehrere verschiedene Diagramme euf einen figure habe.

Gruß...
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: 09.08.2010, 16:07     Titel:
  Antworten mit Zitat      
Hallo Homer,

ich kann mich kaum darum herum drücken, Dir die unpraktischtse Lösung zu zeigen:
Code:
for i=106:111
bar(-[eval(sprintf('s%d', i)), 0.3), title ('Beispiel');
end


Deutlich stabiler und sicherer wäre es aber, die Variablen als Felder eines Structs zu definieren und per "dynamic field names" darauf zuzugreifen:
Code:

Data.s106 = rand(1, 10);  % Beispieldaten
Data.s107 = rand(1, 10);  % Beispieldaten
... etc
for i=106:111
bar(-Data.(sprintf('s%d', i)),0.3), title ('Beispiel');
end


SPRINTF oder INT2STR ist kein nennenswerter Unterschied, vielleicht eine Geschmacksfrage. Aber EVAL zu vermeiden kann einem viel Debug-Zeit einsparen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 03.08.10
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 09.08.2010, 16:37     Titel:
  Antworten mit Zitat      
Leider ist die Grafische Ausgabe auch bei der unpraktischen Lösung nicht die selbe, als wenn ich es ohne Schleife laufen lasse Crying or Very sad

Trotzdem Vielen Dank für die Hilfe.

Vielleicht gibt es doch noch eine andere Lösung für mein Problem?

Gruß
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: 09.08.2010, 17:58     Titel:
  Antworten mit Zitat      
Hallo Homer,

Moment mal. BAR(Matrix) erzeugt natürlich andere Ausgaben als [BAR(Vector), BAR(Vector), ...].
Wieso möchtest Du denn eine FOR-Schleife benutzen?

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.