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

Dynamischer Struct

 

bumbumquietsch*
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 55
Anmeldedatum: 17.10.11
Wohnort: München
Version: R2011b
     Beitrag Verfasst am: 28.10.2011, 14:18     Titel: Dynamischer Struct
  Antworten mit Zitat      
Servus Leute

bin gerade am Programm Code schmälern und hab mir einen dynamischen (variablen) Programmablauf überlegt. Ich hab eine For-Schleife gerneiert, die bis zu einem maximalen Wert geht der sich aus einer gegebenen Matrix bestimmt. Danach wird in dieser Schleife eine bestimme Anzahl von Indizes gesucht. ich generiere mit Hilfe von

Code:
v=['hoch',num2str(i)];


eine dynamische Anzahl von variablen, in denen mit Hilfe von "eval" die Werte geschrieben werden die ich brauche.

Nun soll die werte in einem Dynamischen Struct gespeichert werden.
Das heißt: Auf ist meine allgemeine structvariable. Und in diese sollen die einzelnen werte aus auf1, auf2, auf3 usw. gepsichert werden.

ich habe schon

Code:
auf.auf(num2str(i))=auf(num2str(i))


versucht, aber da meckert er. Ist vielleicht nur ne kleinigkeit. Wenn einer helfen kann wäre ich sehr dankbar Smile Hier ist mein Code:


Code:
function [ auf] =  Zähl ( maxzahl, US )
   
    for i=1:(maxzahl-1)
        idx=find(US(:,2)==i & US(:,11)==(i+1));
        v=['auf',num2str(i)];
        eval ([v '=US (idx,:)']);    
 
end
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

die Klammern anders setzen reicht:

Code:
auf.(['auf' num2str(i)])=auf(num2str(i))  


Damit wird der Ausdruck in den Klammern vorrangig ausgewertet.

Das EVAL in deinem anderen Code ist übrigens überflüssig, wenn du deine Struktur direkt belegst.

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: 28.10.2011, 15:18     Titel: Re: Dynamischer Struct
  Antworten mit Zitat      
Hallo bumbumquietsch*,

Zitat:
ich generiere mit Hilfe von
Code:
v=['hoch',num2str(i)];

eine dynamische Anzahl von variablen, in denen mit Hilfe von "eval" die Werte geschrieben werden die ich brauche.

Das ist grundsätzlich eine schlechte Idee. Um genau zu sein: Eine besonders schlechte.

Matlab kann Schleifen sehr schnell bearbeiten, wenn man es läßt. Zwischendurch Variablen dynamisch zu erzeugen ist eine ectreme Bremse:
Code:

function f1       % Reference function
tic;
a = 1;
b = 2;
for i = 1:1e7
  b = a + b;
end
toc
% >> 0.049 sec

function f3          % Disable efficient lookup table by EVAL
tic;
a = 1;
b = 2;
for i = 1:1e7
  b = a + eval('b');
end
toc
% >> 38.43 sec

7800 mal langsamer. Und dabei ist das noch ein trviales Beispiel.

Das weitaus größere Problem ist das Debuggen: Da man bei der dynamischen Erzeugung von Variablen beim Lesen des codes den Ursprung einer Variablen nicht mehr sehen kann, Fallen Fehler dabei kaum auf. Auch Matlab selbst ist davon verwirrt, wenn z.B. ein Funktionsname während des Programmlaufs von einem Variablennamen überschrieben wird:
Code:
function uglyTest
a = 1:10;
eval('mean = 1:10;');
disp(mean(a))   % >> 5.5
which('mean')   % >> mean is a variable
disp(eval('mean(a)'));  % >> 1,2,3,4,5,6,7,8,9,10    Brrrrrr
 

Wenn man das aber im Command-Window laufen läßt (ohne "function ..."), wird beide Male der Vektor angezeigt. Gruselig.

Weit besser als mehrere Variablen dynamisch per EVAL zu erzeugen ist entweder die Variablen in ein CELL-Array zu schreiben, oder sie per "dynamic field names" als Felder in einem Struct zu erzeugen.
Code:
function [ auf] =  Zaehl(maxzahl, US)   % Kein "ä" im Funktionsnamen!
for i=1:(maxzahl-1)
   idx = (US(:, 2) == i & US(:, 11) == (i+1));   % FIND ist überflüssig
   S.(sprintf('auf%d', i)) = US(idx, :);
end

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 55
Anmeldedatum: 17.10.11
Wohnort: München
Version: R2011b
     Beitrag Verfasst am: 29.10.2011, 16:11     Titel:
  Antworten mit Zitat      
Hey Jan, hey Harald,

dnake für die Nette Hilfe, funktioniert natürlich richt gut Wink Das mit dem Eval Befahl wusste ich nicht, so funktioniert es natürlich auch! Smile

Jetzt hab ich noch eine Frage für mein weiteres vorgehen:

Ich würde gerne die Länge der Matrix bestimmen und sie durch einen Gesamt wert teilen, den ich vorher definiert habe. Und diese Werte sollen danach in meinen struct geschrieben werden. ich hab das ganze folgendermaßen aufgebaut, jedoch werden die structs immer mit 0 belegt:


Code:
function [ auf] =  Zähl ( maxzahl, US )
   
function [ auf] =  Zaehl(maxzahl, US)   % Kein "ä" im Funktionsnamen!
for i=1:(maxzahl-1)
   idx = (US(:, 2) == i & US(:, 11) == (i+1));   % FIND ist überflüssig
   auf.(sprintf('auf%d', i)) = US(idx, :);

   %Neuer Rechenteil: Speichern in Hilfsvariable
   a(num2str(i)) = lentgh(sprintf('hoch%d',i);
   auf.(sprintf('hoch%d', i)).gesamt = (a(i)/gesamt)*100;

end

 


Er generiert mir meinen Struct richtig, schreibt aber immer die Falschen Werte in die matrizen. Er bringt "??? Warning: Struct field assignment overwrites a value with class "double"
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: 29.10.2011, 23:29     Titel:
  Antworten mit Zitat      
Hallo bumbumquietsch*,

Was genau soll diese Zeile bewirken:
Code:
a(num2str(i)) = lentgh(sprintf('hoch%d',i);

Wie kann der Struct richtig generiert werden, wenn das Programm mit einer Fehlermeldung abbricht? In welcher Zeile erscheint der Fehler?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
throttle
Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 23.06.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.07.2016, 11:44     Titel:
  Antworten mit Zitat      
Hallo,

möchte das Thema nochmal ausbuddeln, da ich gerade ein ähnliches Problem habe und Jan zustimme, dass es wünschenswert ist, die FAQ um dieses Problem zu erweitern.

Ich wünsche mir ebenfalls einen dynamischen Struct, bei dem sich die Anzahl der zu erzeugenden Felder aus einer eingelesenen Datei ergibt. Es sind zwar nicht viele Felder, aber da die Anzahl schwankt werden die Daten sonst nicht korrekt zugeordnet.
Aussehen sollte dies dann so:

Werte.P1
Werte.P2
Werte.P3
...

Die Zuordnung der Daten erfolgt dann in einer nachfolgenden Schleife.

Ist eine derartige Strukturierung auch ohne Funktion möglich, also einfach ins Skript zu integrieren?
Blicke bei bumbumquietsch*s Lösung nicht ganz durch, wie das mit den Variablen am Ende aussehen soll und wie die Eingangsdaten aussehen.
Für mich wäre es hilfreich, wenn hierzu nochmal jemand eine abstrakte Lösung darstellen könnte.

Viele Grüße
throttle
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

hier die Kurzfassung:
Code:
for I = 1:N
Werte.(['P' num2str(I)]) = ...
end


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
throttle
Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 23.06.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.07.2016, 22:17     Titel:
  Antworten mit Zitat      
Super, hab vielen Dank!
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.