Verfasst am: 09.12.2011, 10:47
Titel: Dynamische Programmierung von for-Schleifen f. viele Var.
Hallo Leute,
ich habe folgendes Problem: Ich möchte 2 Mat-files mit gleicher Anzahl an Variablen zu einer einzigen vereinigen. Dies möchte ich mittels ein paar for-Schleifen bewerkstelligen. Habe dazu auch bereits einen Code gefunden, der hier einmal für 2 Parameter ausgeführt ist (t und CAN1_General_radar_status_actual_vehicle_speed, beide sind in dem struct "Parameter" gespeichert):
for index=1:Y(1)
t(XZ,1)=Z(index,1);
index=index+1;
XZ=XZ+1;
end end
if iii>1 for index=1:Y(1) if index==1
t(XZ,1)=t(XZ-1,1)+Z(index,1);
end if index>1
t(XZ,1)=t(XZ-1,1)+Z(index,1)-Z(index-1,1);
end
index=index+1;
XZ=XZ+1;
end end
for index=1:B(1)
CAN1_General_radar_status_actual_vehicle_speed(X,1)=A(index,1);
index=index+1;
X=X+1;
end
Als Beispiel-Parameter habe ich hier t (für die Zeit) und den Parameter CAN1_General_radar_status_actual_vehicle_speed gewählt. Das funktioniert soweit auch ganz gut, sprich:
Wenn ich für t in der ersten file 45001 Werte und in der zweiten file 43001 Werte habe, bekomme ich am Ende 88002 Werte für t.
Mein Problem ist der Parameter CAN1_General_radar_status_actual_vehicle_speed, da es von diesem noch etliche mehr gibt (in den files, an denen ich das Ganze teste sind es insgesamt 699). Ich möchte das Ganze dynamisch programmieren, da die Zahl der Parameter von file-Block zu file-Block unterschiedlich sein kann.
Sprich: Ich bräuchte eine dynamische Programmierung um folgendes hinzukriegen:
Sämtliche Parameter habe ich neben dem struct mit dem Namen "Parameter" auch in einem Cell-Array mit dem Namen "names" abgespeichert (über den who-Befehl, taucht hier im Code nicht auf). Ich versuche das Problem über for-Schleifen, assignin und eval zu lösen, komme aber auf keinen grünen Zweig, da ich nicht vernünftig auf das Cell-Array zugreifen kann (es scheitert mal wieder am Syntax ) Irgendwelche Vorschläge? Mir ist klar, dass das alles nicht sauber programmiert ist und eine hohe Rechenzeit erfordert, aber besser bekomme ich es im Moment leider nicht hin... Vielen Dank für eure Hilfe!!
Verfasst am: 09.12.2011, 11:26
Titel: Re: Dynamische Programmierung von for-Schleifen f. viele Var
Hallo FunkFreaker,
Das Programm ist wirklich sehr unsauber programmiert. Ein paar Tips:
"clear all; clc; close all;": Das bringt Dir nichts. Es macht das Programm aber deutlich langsamer. Besser wäre es, das Programm in eine Funktion zu packen, so dass man Interferenzen mit existierenden Variablen sauber ausschließen kann, ohne gleich alles zu löschen, was im Speicher steht.
"for iii=1:ii, ... clear(... ,'ii', ...);": Das ist zwar valide Matlab-Syntax, für einen Leser aber zumindest verwirrend.
"char(filename(iii));": Hübscher: filename{iii}
"CAN1_General_radar_status_actual_vehicle_speed": Das ist zwar bildlich, aber gibt es auch einen "CAN1_General_radar_status_nonactual_vehicle_speed"? Und wie aufwändig ist es beim Lesen, diese beiden Variablen auseinander zu halten?
"for index=1:Y(1), ... index=index+1; ... end": Den Schleifenzähler innerhalb einer FOR-Schleife zu ändern, bringt nichts! In der nächsten Iteration wird er auf den nächsten Wert des Vektors gesetzt. Das dient also nur zur Täuschung des Lesers, oder es ist ein Bug.
Statt:
Code:
for index=1:Y(1) if index==1
t(XZ,1)=t(XZ-1,1)+Z(index,1);
end if index>1
t(XZ,1)=t(XZ-1,1)+Z(index,1)-Z(index-1,1);
end
index=index+1; % Hier wieder ein Schleifen-Zähler-Bug!
XZ=XZ+1;
end
Auf den Einsatz von "A1" .. "A699" solltest Du unbedingt verzichten. Eine komplizierte Methode, um so viele Variablen dynamisch zu erstellen erfordert eine noch kompliziertere, um später wieder darauf zugreifen zu können.
Zitat:
Ich versuche das Problem über for-Schleifen, assignin und eval zu lösen, komme aber auf keinen grünen Zweig, ...
Von ASSIGNIN und EVAL finde ich in Deinem Code gar nichts. Es wäre aber wirklich auch nicht hilfreich, sondern würde den Code noch komplizierter machen. Und er ist jetzt schon so unübersichtlich, dass ich auch nach mehrmaligen Durchlesen nicht verstehe, was er genau machen soll.
Ich empfehle deshalb noch mal von vorne zu beginnen und das ganze Programm sauber zu implementieren. Das wird insgesamt immer noch schneller sein, als viele Stunden ins Debuggen und Warten das Codes zu investieren.
erstmal vielen Dank für deine Antwort und deine Tipps, die ich beherzigen werde. Ich kann ja nochmal erklären, was das Programm machen soll:
Ich habe in file 1 die Parameter:
A1 mit 45001 Werten
A2 mit 45001 Werten
A3 mit 45001 Werten
.
.
A699 mit 45001 Werten
In file 2 habe ich die Parameter:
A1 mit 43001 Werten
A2 mit 43001 Werten
A3 mit 43001 Werten
.
.
A699 mit 43001 Werten
Am Ende soll herauskommen:
A1 mit 88002 Werten
A2 mit 88002 Werten
.
.
.
A699 mit 88002 Werten.
Um dies zu realisieren werden die for-Schleifen durchlaufen. Dabei ist es schon richtig, das der Wert von "index" sich jedesmal erhöhen soll, diese Schleife wird solange durchlaufen, bis sich der Wert von t auf die Gesamtanzahl der Werte beider files erhöht hat (Im Beispiel 88002).
Zitat:
"CAN1_General_radar_status_actual_vehicle_speed": Das ist zwar bildlich, aber gibt es auch einen "CAN1_General_radar_status_nonactual_vehicle_speed"? Und wie aufwändig ist es beim Lesen, diese beiden Variablen auseinander zu halten?
Nein, den gibt es nicht. Am Ende meines ersten Posts sind weitere Beispiele für mögliche Parameternamen aufgeführt, die so auch tatsächlich in meinen files vorkommen. Ich habe möglichst verschiedene gewählt, um deutlich zu machen, dass es hier nicht im Schema f geht.
Zitat:
Ich empfehle deshalb noch mal von vorne zu beginnen und das ganze Programm sauber zu implementieren. Das wird insgesamt immer noch schneller sein, als viele Stunden ins Debuggen und Warten das Codes zu investieren.
Tja, was heißt sauber implementieren? Eine andere Methode fällt mir momentan leider auch nicht ein, also werde ich vorerst auf diese hier zurückgreifen müssen, egal, wieviel Rechenzeit am Ende beansprucht wird, so lange es funktioniert...
Wie gesagt, mit ist schon klar, dass das unsauber programmiert ist, es ist ja auch noch nicht fertig. Mein eigentliches Problem, die dynamische Programmierung der for-Schleife, ist leider damit noch nicht gelöst...
Dabei ist es schon richtig, das der Wert von "index" sich jedesmal erhöhen soll, diese Schleife wird solange durchlaufen, bis sich der Wert von t auf die Gesamtanzahl der Werte beider files erhöht hat (Im Beispiel 88002).
Nein, das Erhöhen von "index" innerhalb einer Schleife, die ebenfalls "index" als Zähler benutzt ist nicht richtig. Die FOR-Schleife kümmert sich bereits um den "index". Versuche es einfach mal:
Code:
for index = 1:10 disp(index)
index = index + 1; % Bringt nichts - ausser Verwirrung disp(index) end
Eine andere Methode fällt mir momentan leider auch nicht ein, also werde ich vorerst auf diese hier zurückgreifen müssen, egal, wieviel Rechenzeit am Ende beansprucht wird, so lange es funktioniert...
Ich stimme mit Dir überein, dass die Laufzeit hier nicht das ausschlaggebende Argument ist. "Solange es funktioniert" würde aber bedeuten, dass es funktioniert. Es funktioniert aber nicht.
Ich kann bisher weder Deine Problem-Beschreibung noch Deinen Code verstehen, und ich sehe auch nicht, was beide genau miteinander zu tun haben. Nun meine ich behaupten zu können, dass ich einige Erfahrung mit Matlab-Programmen habe, auch aus verschiedenen Matlab-Foren. Deshalb traue ich mich mal zu oraklen: So, wie bisher dargestellt, wid Dein Programm nicht funktionieren. Die Herangehensweise ist zu kompliziert.
Ich empfehle Dir Arrays zu benutzen, statt den Index in den Namen der Variablen zu packen. Verwende LOAD mit einer Ausgabe, anstatt die Daten unkontrolliert in den Workspace zu schreiben. Starte SAVE mit dem "-struct"-Flag und übergebe ein Struct als Input. Verzichte auch die CLEARs. Räume die FOR-Schleifen auf.
Es wäre natürlich schön, wenn Du das Programm trotzdem meiner negativen Prognose zum Laufen bringst. Vielleicht kann Dir auch jemand anderes im Forum weiter helfen.
mir wird auch beim mehrmaligen lesen absolut nicht klar, warum
* ewig lange Namen verwendet werden
* die ewig langen Namen dann in A, B oder C stehen (was für ne Nomenklatur soll das sein? Kommst du vom Z80?)
* Y die Länge von Z ist, XY irgendnen Zählsinn hat und X völlig sinnfrei belegt wird
* keine Kommentare dran sind, wenn es schon nicht läuft
_________________
Ich hasse es wenn die Leute Fragen stellen, man dann versucht sich Mühe zu geben, und diejenigen ihren Thread nie wieder besuchen...
Einstellungen und Berechtigungen
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
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.