Aeromechaniker (m/w) Aerodynamische und flugmechanische Vor-/Feinauslegung von LenkflugkörpernLFK-Lenkflugkörpersysteme GmbH - Unterschleißheim (ab 2011 Schrobenhausen)
B Stellt Alle Start und Ende für den zugehörigen Vektor. bei laenge 4 kriegst du 2 Fälle und bei laenge 5 kriegst du einen Fall von 3 bis 7.
Gruß
Jose
_________________
Simulation
Zuletzt bearbeitet von josekamara am 14.07.2010, 21:06, insgesamt einmal bearbeitet
pooz
Forum-Anfänger
Beiträge: 26
Anmeldedatum: 04.05.09
Wohnort: ---
Version: ---
Verfasst am: 14.07.2010, 21:04
Titel:
@denny
Tatsache! Nicht schlecht. Vorallem liefert Tic/Toc schnelle Zeiten.
Jedenfalls schneller als meine Methode.
Gibt es evtl eine noch effizientere Methode? Ich frage aus 2 Gründen:
Zum Einen möchte ich später diesen Algorithmus nach C portieren, zum Anderen wundert es mich, dass man einen Vektor-Vergleich (also finde A in B, wobei length(A)<length(B)) mit einem String-Befehl löst.
(Ich habe es vergeblich mit "ismember" und "intersect" versucht.)
Aber vielen Dank dafür!!
pooz
Forum-Anfänger
Beiträge: 26
Anmeldedatum: 04.05.09
Wohnort: ---
Version: ---
Verfasst am: 14.07.2010, 22:19
Titel:
@Jose,
vielen Dank.
Deins funktioniert auch!
Bei sehr großen Vektoren allerdings benötigt das viel mehr Rechenzeit. Ich vermute, das liegt an der FOR-Schleife.
Ich bin allerdings auf der Suche nach einem rechengünstigen Algorithmus. Mit der Version von denny bin ich schon auf dem guten Weg, denke ich
denny
Supporter
Beiträge: 1537
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2007b, R2009b
Verfasst am: 15.07.2010, 09:20
Titel:
Hallo
es gibt noch eine Möglichkeit über DIFF das zu lösen
Das STRFIND auch mit nicht-CHAR-Arrays arbeitet ist sehr praktisch und sollte in der Dokumentation deutlicher betont werden.
Eine Schwachstlle ist "[0 A]" und [A, 0]" für sehr große Vektoren A: Es werden im schlimmsten Fall (2*(length(A)+1)*8) Bytes im Speicher blockiert. Das ist zwar nur temporär, wenn der Rechner aber den RAM-Inhalt auf die Platte schreiben muss, wird es unerträglich langsam.
Ich vermute für riesige A ist dies sicherer (also schneller):
Code:
Laenge = 4
A = (rand(1, 1e8) > 0.5); % Beispiel Daten
Start = strfind(A, [0ones(1,Laenge)]);
ifall(A(1:Laenge) == 1)
Start = [1, Start];
end
Ende = strfind(A, [ones(1,Laenge)0])+Laenge-1;
ifall(A(end-Laenge+1:end) == 1)
Ende = [1, Ende];
end
Für kleine A ist das aber vermutlich langsamer.
Wenn Du das ganze in C schreibst, kannst Du die beiden STRFIND glichzeitig laufen lassen, was wohl etwa doppelt so schnell sein sollte.
Gruß, Jan
pooz
Forum-Anfänger
Beiträge: 26
Anmeldedatum: 04.05.09
Wohnort: ---
Version: ---
Verfasst am: 15.07.2010, 17:45
Titel:
Danke, ihr Beiden.
@denny:
Dein neuer Algo findet nur das erste Paar. Weitere Folgen, die auch die Bedingungen erfüllen, werden nicht angezeigt.
@Jan:
Ich komme nicht auf das gleiche Ergebnis:
Das leichteste, was ich beheben konnte war, auf den Lösungsvektor "Start" 1 zu addieren. Dann klappts.
Aber der "Ende"-Vektor fängt mit 1 an? Und das Ende einer letzten Folge ist mir auch nicht ersichtlich (siehe Ende(end))
Viele Grüße!
denny
Supporter
Beiträge: 1537
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2007b, R2009b
Verfasst am: 15.07.2010, 23:13
Titel:
Hallo pooz,
habe kleinen Fehler beim Abziehen gemacht, im Beispiel kommen ja 5 Einsen hintereinander, habe ja darauf getestet, und deswegen übersehen dass mit 4 Einsen es nicht funktioniert hat.
Zusätzlich hätte ich eine 2. Frage passend dazu, an Alle:
Wie kann ich am besten/effizientesten/einfachsten nun alle Bereiche in Vektor A auf Null setzen, die diese Bedingung (Mindestlänge) nicht erfüllen? Oder andersherum formuliert: Wie kann ich einen neuen Vektor A_neu erstellen, der in den zurückgegebenen Intervallen -also von Start bis Ende- true ist, und überall anders false?
Ich habe das leider nur mit einer For-Schleife lösen können:
Du hast Denny geschrieben, dass es "einen Fehler gibt" - es ist immer praktisch auch zu lesen, wie die Fehlermeldung denn lautet.
Die gepostete FOR-Schleife läßt sich beschleunigen: Bisher ist "A_neu" ein DOUBLE Vektor, in den Du "true"-Werte schreibst. Diese werden intern von LOGICAL (eigentlich ein uint8) nach DOUBLE gecastet (heißt das so auf Deutsch?). Schneller wäre es, gleich ein LOGICAL Vektor zu erstellen:
Code:
A2 = false(1, length(A));
on = true;
for l = 1:length(Start)
A2(Start(l):Ende(l)) = on; % Nicht "A" end
Ausserdem habe ich die Antwort der Funktion(!) TRUE abgespeichert, weil ein Funktionsaufruf einen größeren Overhead hat, als das Kopieren einer Variable.
Eine andere Lösung als die FOR-Schleife wäre CUMSUM:
% musste eine 1 dazu addieren
posOk = (Ende-Start+1) >=Laenge;
Start = Start(posOk);
Ende = Ende(posOk);
pooz
Forum-Anfänger
Beiträge: 26
Anmeldedatum: 04.05.09
Wohnort: ---
Version: ---
Verfasst am: 29.07.2010, 18:45
Titel:
Vielen Dank an alle, für die Hilfe.
jetzt habe ich eine 2. Frage, passend dazu:
Wie kann ich nun die vielen Start&Ende-Paare, aus den jeweiligen Vektoren "Start" und "Ende" in einem Schritt zur Adressierung verwenden?
Zur Zeit gehe ich noch mit einer Schleife durch, und erhalte einzelnd ein Start&Ende-Paar, was ich zur Adressierung verwende:
Code:
% Start = (1, 5, 20); % Ende = (3, 9, 30);
for i = 1:length(Ende)
x(Start(i):Ende(i)) = true;
end
Geht es effizienter? Vielleicht ohne Schleife?
Vielen Dank für eure Hilfe!
Jan S
Forum-Guru
Beiträge: 393
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 6.5, 2009a
Verfasst am: 30.07.2010, 14:47
Titel:
Hallo Pooz,
mir war so, als hätte ich das am 19.07.2010, 20:41 bereits beantwortet.
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.