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

Laufvariable in Zähler gesteuerter Schleife

 

maxkusenberg
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 28.11.11
Wohnort: Berlin
Version: 7.04.365(R14) Service Pack 2
     Beitrag Verfasst am: 28.11.2011, 16:18     Titel: Laufvariable in Zähler gesteuerter Schleife
  Antworten mit Zitat      
In einer zählergesteuerten Schleife erzeuge ich drei Zeilenvektoren
Code:

clear all;
clc;

FEED_X_START=[0.5 0.3 0.1 0.1; 0.3 0.2 0.1 0.5; 0.1 0.5 0.2 0.2];   % Matrix           (3x4)
FEED_NORM_START=[600; 300 ; 200 ; 100 ]                                  % Spaltenvektor(4x1)

    for a = 1:3
        assignin ('base',['FEED_X_' num2str(a)], FEED_X_START(a,:).*FEED_NORM_START(a,:))
    end
 


Die drei Vektoren haben 3 verschiedene Namen:
Code:

  FEED_X_1       1x4                        32  double array
  FEED_X_2       1x4                        32  double array
  FEED_X_3       1x4                        32  double array
 


Ich möchte diese Vektoren mittels einer Schleife (!) in eine Matrix F (3x4) zusammenfassen

Code:

for i = 1:3
F(i,:)=[FEED_X_i;]
end
 


Das Zusammenfassen funktionniert nicht. Die Ausgabe lautet

Code:

??? Undefined function or variable "FEED_X_i".

Error in ==> TESTT at 14
F(i,:)=[FEED_X_i;]
 



Warum schnallt er denn nicht, dass FEED_X_i eben FEED_X_1 ist wenn i gleich 1 ist.
... Kann mir jemand helfen?
Private Nachricht senden Benutzer-Profile anzeigen


Matt Lappen
Forum-Anfänger

Forum-Anfänger


Beiträge: 42
Anmeldedatum: 23.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.11.2011, 16:43     Titel:
  Antworten mit Zitat      
Hi,
du sprichst in deinem Code die Variable 'FEED_X_i' an und diese gibt es nicht. Um einen Code in einer Schleife zu variieren, kannst du den eval() Befehl benutzen:
Code:
for i = 1:3
F(i,:)=eval(['FEED_X_',num2str(i)]);
end
Private Nachricht senden Benutzer-Profile anzeigen
 
maxkusenberg
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 28.11.11
Wohnort: Berlin
Version: 7.04.365(R14) Service Pack 2
     Beitrag Verfasst am: 28.11.2011, 16:48     Titel:
  Antworten mit Zitat      
1.000 Dank!
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: 28.11.2011, 16:55     Titel: Re: Laufvariable in Zähler gesteuerter Schleife
  Antworten mit Zitat      
Hallo maxkusenberg,

Das "clear all" zu Beginn löscht alle in den Speicher geladenen Funktionen. Das erneute Einlesen und Übersetzen ist sehr zeitaufwändig. Während das Löschen der Variablen in sehr seltenen Fällen helfen kann Tippfehler in Scripts zu entdecken -das ist aber eine Holzhammer-Methode-, ist "clear all" für gar nichts nützlich - es sei denn, man hat während das Programm läuft den Code aller M-Files dynamisch geändert...

Einen Index im Namen der Variablen zu verstecken ist, wie Du merkst, eine komplizierte Methode. Sie gehört aber zu den am häufigsten implementierten "bad programming practizes".

Und die Nutzung von Inputs und Outputs ist ebenfalls deutlich effizienter als Variablen "ferngesteuert" per ASSIGNIN zu erzeugen. Auch die Lösung per EVAL ist erstens häufig eine Quelle von Fehlern, zweitens kaum zu debuggen und drittens bremst es Matlab stark aus.

Ein Index ist dagegen als Index sehr praktisch. In Deinem Fall "FEED_X_{i}". Das Zusammenfassen der Vektoren wäre dann:
Code:
F = cat(1, FEED_X_{:});


Zitat:
Warum schnallt er denn nicht, dass FEED_X_i eben FEED_X_1 ist wenn i gleich 1 ist.

Nun, die Frage ist schwer zu beanwtorten. Es wäre schon sehr spirituell, wenn Matlab verstehen würde, was Du möchtest, obwohl Du explizit hingeschrieben hast, dass Du die Variable "FEED_X_i" meinst. Es gab zwar immer wieder Forderungen, dass Matlab endlich den dwim-Operator enthält - "do what I mean". TMW weigert sich aber bisher - Google weiß mehr dazu:
Code:
feature('dwim');

Damit würde Matlab dann in "FEED_X_i" automatisch statt "i" die gewünschte Zahl einsetzen, aber natürlich nicht in "pi", "inf", "input" etc. Bis dahin müssen wir aber noch explizit angeben, wann "i" ein Index sein soll.

Gruß, Jan

PS. Sollte irgend jemand verwirrt sein: Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
maxkusenberg
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 28.11.11
Wohnort: Berlin
Version: 7.04.365(R14) Service Pack 2
     Beitrag Verfasst am: 30.11.2011, 11:55     Titel:
  Antworten mit Zitat      
Hallo Jan,

Deine Punkte leuchten mir ein. Den Hinweis zum clear Befehl lass ich mal so stehen. Aber spätestens bei assignin und eval stimme ich Dir absolut zu. Das ist Käse. Was mir spätestens auffält, seit ich beide Funktionen in einander schachteln muss, was ganz genau mal garnicht geht. Ich denke also angestrengt über eine alternative Struktur nach....

Dein Vorschlag den cat Befehl für das zusammenfassen der 3 Vektoren zu benutzen ist super, weil ich mit dieser Funktion nun bewusst bin und bestimmt oft gebrauchen werde.
Könntest Du, oder jmd. anderes aber bitte nochmal helfen und aufklären, warum ich folgendes "Ergebnis" erhalte?

Eingabe wie oben beschrieben
Code:
FEED_X_START=[0.5 0.3 0.1 0.1; 0.3 0.2 0.1 0.5; 0.1 0.5 0.2 0.2]; % Matrix       (3x4)
FEED_NORM_START=[600; 300 ; 200 ; 100 ];                        % Spaltenvektor(4x1)

    for a = 1:3
        assignin ('base',['FEED_X_' num2str(a)], FEED_X_START(a,:).*FEED_NORM_START(a,:))
    end

danach
Code:
F = cat(1, FEED_X_{:});

"Ergebnis"
Code:
?? Undefined variable "FEED_X_" or class "FEED_X_".

Error in ==> SCHMIERBLATT at 20
F = cat(1, FEED_X_{:});


10.000 Dank
Private Nachricht senden Benutzer-Profile anzeigen
 
soad
Forum-Century

Forum-Century


Beiträge: 150
Anmeldedatum: 10.11.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.11.2011, 13:34     Titel:
  Antworten mit Zitat      
Im Grunde ist es das gleiche Problem wie zuvor. Eine Möglichkeit wäre:
Code:
F =  bsxfun(@times, FEED_X_START, FEED_NORM_START(1:end-1))
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.