Matlab Schleifen

Hallo Zusammen!
Ich hoffe, dass mir jemand zu meinem folgenden Problem einen Tipp oder eine Hilfestellung geben kann.

Ich bin zur Zeit dabei mit Matlab eine Simulation einer VR-World zu dynamisieren. Unter anderem gibt es dort einen Befehl, bei dem ich einer Variable einen Wert bzw. Konten aus meiner VR-World zuweisen kann:

tm1_1 = vrnode (world, ‚tm1_1‘);

Damit ich mir Arbeit spare, wollte ich die Zuweisung automatisiert mit einer for-Schleife durchführen und im o.a. Beispiel die ‚_1‘ durch ‚_i‘, also der Laufvariablen ersetzen. Dies funktioniert aber nicht!
Folgender Aufbau erzeugt eine Fehlermeldung:
for i=1:m;
tm1_(‚i‘)= vrnode (world, [‚tm1_‘, num2str(i, ‚%d‘)]);
end;

So, nun seid Ihr dran :smile:

Hallo,

for i=1:m;
tm1_(‚i‘)= vrnode (world, [‚tm1_‘, num2str(i, ‚%d‘)]);
end;

Hast du es mal mit sprintf probiert?

Grüße,
Moritz

Kann ich denn mit sprintf in einer Schleife eine neue Variable so oft erstellen lassen bis die Abbruchbedingung erreicht ist?
Ich denke nicht, dass das funktioniert.
sprintf gibt mir doch nur etwas auf dem Bildschirm aus!

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

Kann ich denn mit sprintf in einer Schleife eine neue Variable
so oft erstellen lassen bis die Abbruchbedingung erreicht
ist?

Nein, aber du kannst damit zumindest den zweiten Teil deines Problems elegant lösen. Und für den ersten Teil gibt es Arrays, bei matlab als Vektoren implementiert:

tml(i) = vrnode(world, sprintf(„tml_%d“, i)

(wobei ich nicht genau weiss, was vrnode macht)

Es ist sinnlos die Variablem tml_1 bis tml_m benennen zu wollen, wenn du einfach alles in einen Vektor schreiben kannst.

Ich denke nicht, dass das funktioniert.
sprintf gibt mir doch nur etwas auf dem Bildschirm aus!

sprintf schreibt etwas in einen String, nicht auf den Bildschirm.

Grüße,
Moritz

Hallo Marco,
ich habe 2 Bemerkungen

  1. num2str hat bei mir (Matlab5) kein Format, also
    [‚tm1_‘, num2str(i)]
    ist gleich: sprintf(‚tm1_%d‘, i)

  2. Die Problemstellung ist mir nicht klar.
    Wie Moritz schon vorschlug, kannst Du das Ergebnis (Zahl) einem Element eines Vektors tm zuweisen, die erzeugten tm1_i sind aber strings.
    Um das Programm auzufrufen braucht Du die eval Funktion, die den String auswertet.
    Also etwas in der Art (kann es gerade nicht testen)

for i=1:m;
befehl = sprintf(‚vrnode(world, tml_%d)‘,i)
tml(i) =eval(befehl)
end

weist dem Element i im Vektor tml das Ergebnis der Rechnung zu.

oder:
for i=1:m;
befehl = sprintf(‚tml_%d = vrnode(world, tml_%d)‘,i,i)
eval(befehl)
end;

erzeugt in der Schleife fortlaufend den Befehl
tml_1 = vrnode(world, tml_1)
tml_2 = vrnode(world, tml_2)
usw., der in der Schleife mit eval ausgewertet wird.

Gruss
Albert

Hallo Albert,

  1. num2str wandelt zumindest in Matlab 7.1 (R 14) eine Zahl (double) in einen String um. Das funktioniert auch. Es funktiniert also beides (disp + sprintf, wobei letzteres ordentlicher ausschaut!)

  2. Deine Lösung mit eval funktioniert nicht, da ich den Befehl nicht nutzen kann (??? Error using ==> eval
    Undefined function or variable ‚tml_1‘.).

–>Teillösung:
m=600;
for i=1:m;
knoten = sprintf(‚tm1_%d = vrnode(world, tm1_%d)‘,i,i);
disp(knoten);
center = sprintf(‚tm1_%d.center = [0.45 0 0]‘,i);
disp(center);
end;

Liefert eine fehlerfreie Ausgabe, jedoch werden, so denke ich keine Variablen angelegt, denn ich kann hinterher (also weder in noch außerhalb der Schleife) auf die tm1_1…tm1_600 zugreifen.

Noch mal kurz zu dem Problem.
vrnode ist eine Funktion aus Virtual Reality Toolbox von Matlab, die aus einer .wrl-Datei (VRML) die einzelnen Knoten zugänglich macht.
Es ist also mit Matlab möglich, virtuelle Welten zu simulieren und dynamisieren.
Da ich von meinen tm1_irgendwas ca. 600 Stck. besitze wollte ich diese automatisch als Variable erstellen lassen. Ich denke mal, dass vrnode einen eigenen Datentyp (also vrnode) besitzt und mit Typen wie double o.ä. nichts anfangen kann.

Aber trotzdem werde ich mit den Ansätzen mal weiter rumprobieren.
Vielen Dank erst einmal dafür.

Marco

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]