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

Zählvariable im Variablennamen

 

tommylabamba
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 08.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.09.2012, 12:20     Titel: Zählvariable im Variablennamen
  Antworten mit Zitat      
Ich möchte einem Parameter t einen variablen Namen vergeben mit einer Schleife.

for i=1:1:10
t... = 3;
end;

Dabei soll die Schleife den Parameter
t1
t2
t3
... usw.
erzeugen.
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 16.09.2012, 12:56     Titel:
  Antworten mit Zitat      
Hallo,

das ist zwar mit EVAL möglich, aber in der Regel sehr unzweckmäßig. Besser geeignet ist hier meist ein Cell Array:

Code:
t = cell(1,10);
for i=1:1:10
t{i} = ...;
end;


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
tommylabamba
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 08.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.09.2012, 13:07     Titel:
  Antworten mit Zitat      
Danke Harald. Cool

Hab nun die Timer mit der Schleife erstellt und enum.

for i=1:1:Anzahl
for n=1:1:Pos_Timer_L(1,i)
eval(['t_' num2str(i) '_Pos' num2str(Pos_Timer{i}(1,n)) '=timer']);
end;
end;

Nun aber möchte ich aber zu den erstellten Timern die Laufzeiten setzen.
Diese befinden sich in einem Cell Namens 'Laufzeiten'.
Der Timer soll abwärts oder aufwärts zählen. Wichtig dabei ist das er die Werte aus der Cell liest und sich damit initialisiert.

Welcher der Parmeter beim Timer T=Timer('PropertyName1, PropertyName2) ist nun für die Laufzeit zuständig? Und wie lese ich das am besten in einer Schleife aus und bringe es zu den Timern?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 16.09.2012, 15:19     Titel:
  Antworten mit Zitat      
Hallo,

mir ist nicht klar, warum du dir hier unbedingt EVAL antun willst.

Was soll mit dem Timer erreicht werden? Soll eine Funktion mit einer Verzögerung ausgeführt werden? Einmalig oder wiederholt? Die Eigenschaften von Timer-Objekten sind doch alle dokumentiert.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
tommylabamba
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 08.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.09.2012, 18:41     Titel:
  Antworten mit Zitat      
Es geht nicht darum ein cell mit dem Wert 3 zu erzeugen, sondern um die Variablen t1...t10 mit Wert 3 zu erzeugen. Dabei soll der variable Parametername in einer for-Schleife erzeugt werden.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 16.09.2012, 19:07     Titel:
  Antworten mit Zitat      
Hallo,

dass das deine ursprüngliche Absicht war, ist mir schon klar.
Ich sehe nur insbesondere in diesem Fall keinen Vorteil von 10 verschiedenen Variablen gegenüber einem Cell Array mit 10 Elementen, aber gravierende Nachteile: überfrachteter Workspace, schwieriger zu schreibender und zu debuggender Code "dank" EVAL-Statements.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
tommylabamba
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 08.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.09.2012, 19:12     Titel:
  Antworten mit Zitat      
ich kann doch keine Timer in einem Cell packen oder?
in diesem Fall erzeuge ich Timer mit verschiedenen Variablennamen auf einem Schlag mit der for-Schleife.

Ich würde gerne diese Timer aber in einer Matlab-function erzeugen um sie nicht alle im Workspace zu haben. Aber das geht doch nicht oder?

Wenn das geht, dann wie?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 16.09.2012, 19:35     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
ich kann doch keine Timer in einem Cell packen oder?

Aber sicher:
Code:
t = cell(1,10);
for i=1:1:10
t{i} = timer;
end;


Zitat:
Ich würde gerne diese Timer aber in einer Matlab-function erzeugen um sie nicht alle im Workspace zu haben. Aber das geht doch nicht oder?

Auch da spricht nichts dagegen. Deinen Code oder den oben genannten in eine Funktion packen, fertig. Schwierig wird es nur, wenn du danach noch mit den Timer-Objekten arbeiten möchtest (anhalten, neu starten, umdefinieren etc.). Da ist es nützlich, die Timer-Variablen zur Verfügung zu haben. Und ich fände es schön, die in einer statt in 10 Variablen zu haben Wink

Grüße,
Harald
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: 16.09.2012, 20:00     Titel:
  Antworten mit Zitat      
Hallo tommylabamba,

Harald hat vollkommen recht. Die Handles der Timer sind in einem Cell oder Struct-Array viel besser aufgehoben als in Variablen, in deren Namen ein Index versteckt ist.

Eine sehr einfache und sehr wichtige Regel: Es gibt immer eine andere und vor allem bessere Lösung als EVAL.
Wann immer man also meint, EVAL wäre notwendig oder nützlich, ist dies ein sicheres Zeichen dafür, dass man eine ineffiziente und indirekte Idee verfolgt.

Ausnahme: Umwandlung eines symbolischen in einen numerischen Ausdruck.

Beispiele findest Du hier im Forum zu hunderten.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 08.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.09.2012, 20:25     Titel:
  Antworten mit Zitat      
Schönen Dank.

Allerdings wenn ich es ins Cell packe mit dem Code:

for i=1:1:Anzahl
for n=1:1:Pos(1,i)
t{i}(n,1) = timer;
end;
end;

Dann packt er mir die Timer in das Cell. Wenn Anzahl = 2 ist, und es sind im Pos 1=10 und in Pos=9 Timer, dann steht im Cell:

10x1 timer 9x1 timer

Allerdings wenn ich jetzt in den Timer reingehe, dann kommt Fehlermeldung:

Obj must be a 1-by-1 timer object


Ich hätte die Timer lieber in einer Matrix mit 2 Spalten, erste Spalte 10 timer, 2 Spalte 9 timer.

1x1 timer 1x1 timer
1x1 timer 1x1 timer
... ...
1x1 timer
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: 16.09.2012, 20:54     Titel:
  Antworten mit Zitat      
Hallo tommylabamba,

Zitat:
Allerdings wenn ich jetzt in den Timer reingehe, dann kommt Fehlermeldung: ...

Bitte poste den Code, damit klar wird, was "in den Timer reingehen" bedeutet. Wahrscheinlich fehlt nur ein Klammerpaar oder eine geschwungene statt der runden Klammer.

Zitat:
Ich hätte die Timer lieber in einer Matrix mit 2 Spalten, erste Spalte 10 timer, 2 Spalte 9 timer.

Eine Matrix ist laut Definition immer rechteckig. Deshalb müssen alle Spalten die gleiche Anzahl von Zeilen haben. Wenn Du unterschiedlich lange Vektoren speichern möchtest, ist ein CELL Array dafür geeignet.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 08.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.09.2012, 21:05     Titel:
  Antworten mit Zitat      
Hier der Code:

Code:

Parameter = 2;

Pos = cell(size(Parameter));

for i=1:1:Anzahl
    Pos{i} = find(Parameter{i}(:,24)==0)';
end;

for i =1:1:Anzahl
    Pos_Timer(i) = length(Pos{i});
end;

t = cell(size(Pos));

for i=1:1:Anzahl
    for n=1:1:Pos_Timer(1,i)
        t{i}(n,1) = timer;
    end;
end;
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 16.09.2012, 22:14     Titel:
  Antworten mit Zitat      
Hallo,

für Parameter = 2 macht der folgende Code nicht viel Sinn, insbesondere nicht die Indizierung in ein Cell Array.

Ich würde die Timer als geschachtelte Cell Arrays anlegen:

Code:
for i=1:1:Anzahl
    for n=1:1:Pos_Timer(1,i)
        t{i}{n} = timer;
    end;
end;


Grüße,
Harald
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.