|
|
| Gast |
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 22.01.2012, 21:18
Titel: Vektoren anpassen
|
 |
Hallo zusammen, ich habe folgendes Problem und komme leider nicht auf Lösung, ich hoffe ihr könnt mir weiterghelfen, wahrscheinlich ist es auch gar nicht so schwer:-)
also ich habe einen Vektor derart: A = [0 0 1 2 3 0 0 1 2 0]
jetzt möchte ich ihn derart verändern sodass am Ende folgendes herauskommt:
A = [ 0 0 3 3 3 0 0 2 2 0] d.h dass für einen Bereich welcher ungleichnull ist alle Werte in diesem Bereich den des höchsten Wertes annehmen!
ich habe alles mögliche probiert aber leider ist nie was draus geworden:(
vielen Dank schon mal im Vorraus!!
|
|
|
|
|
|
| Seban |

Forum-Meister
|
 |
Beiträge: 600
|
 |
|
 |
Anmeldedatum: 18.01.12
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ab R2014b
|
 |
|
|
 |
|
Verfasst am: 23.01.2012, 01:45
Titel:
|
 |
Hi,
Kann man vermutlich auch einfacher machen, aber es funktioniert
Vor allem das Erzeugen von B find ich sehr unelegant.
Vielleicht schaut hier noch ein Experte rein und kann das schöner lösen, würde mich interessieren.
Gruß,
Seb
edit:
Das war meine erste Idee: Ich wollte den relevanten Bereich des logischen Vektors von A mit dem Maximum des Bereichs multiplizieren. Weiß jedoch nicht, wie ich das dann zum Ausgabevektor B zusammengefrickelt bekomme.
|
|
|
|
| Gast |
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 23.01.2012, 12:00
Titel:
|
 |
|
Super vielen Dank!starker code:-)
|
|
|
|
| denny |

Supporter
|
 |
Beiträge: 3.853
|
 |
|
 |
Anmeldedatum: 14.02.08
|
 |
|
 |
Wohnort: Ulm
|
 |
|
 |
Version: R2012b
|
 |
|
|
 |
|
Verfasst am: 23.01.2012, 12:20
Titel:
|
 |
|
|
|
| Seban |

Forum-Meister
|
 |
Beiträge: 600
|
 |
|
 |
Anmeldedatum: 18.01.12
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ab R2014b
|
 |
|
|
 |
|
Verfasst am: 24.01.2012, 11:01
Titel:
|
 |
Hab ich mir schon gedacht, dass das mal wieder vektoriell deutlich eleganter zu lösen ist. Das ist mein größtes Problem, ich löse zu viel mit Schleifen etc weil ich mal 2 Veranstaltungen C++ hatte.
Bin zwar mit meinem MATLAB-Buch erst halb durch, aber bisher kam noch nichts dazu. Wie kommt man auf solche Funktionen wir strfind oder cumsum? Macht das einfach die Erfahrung oder sollte man zu Anfang immer nach einer möglicherweise vorhandenen Funktion suchen? Wie ist da eure Herangehensweise (gewesen)?
Grüße,
Seb
|
|
|
|
| denny |

Supporter
|
 |
Beiträge: 3.853
|
 |
|
 |
Anmeldedatum: 14.02.08
|
 |
|
 |
Wohnort: Ulm
|
 |
|
 |
Version: R2012b
|
 |
|
|
 |
|
Verfasst am: 24.01.2012, 15:10
Titel:
|
 |
Das schnappt man sich irgendwo dann auf.
STRFIND habe ich zuerst nur mit Strings angewendet, dann habe ich Beispiele in Forum mit Logischen Arrays gesehen.
CUMSUM habe ich zu selten angewendet. Aus Jan's Bespielen habe ich zu CUMSUM viel gelernt.
|
|
|
|
| Seban |

Forum-Meister
|
 |
Beiträge: 600
|
 |
|
 |
Anmeldedatum: 18.01.12
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ab R2014b
|
 |
|
|
 |
|
Verfasst am: 24.01.2012, 18:25
Titel:
|
 |
| denny hat Folgendes geschrieben: |
| Das schnappt man sich irgendwo dann auf. |
Das beruhigt, kenn durch den Thread ja jetzt 2 neue Funktionen
Was meinst du mit Jans Beispielen?
|
|
|
|
| Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 25.01.2012, 00:21
Titel:
|
 |
Hallo Seban,
Ich habe in diesem Forum ein paar Lösungen mit CUMSUM gepostet, die Suchfunktion sollte sie finden können.
Trotzdem lockt mich eine Schleifen-Lösung hier:
Falls die Werte innerhalb der Blöcke sortiert sind, das größte Element also wie im Beispiel der Orginal-Frage hinten steht, vereinfacht sich das zu:
Ein Vergleich mit der ebenfalls hübschen vektorisierten Methode von denny:
Die Schleife hat hier den Vorteil, dass sie nur die kleinen Blöcke als temporären Speicher benötigt und das etwas bequeme ARRAYFUN vermeidet.
Anmerkung: Dennys Code hängt eine Null an den orginal-Vektor an, falls das letzte Element nicht Null ist. Das müsste man also noch explizit abfragen.
Gruß, Jan
|
|
|
|
| Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 25.01.2012, 00:58
Titel:
|
 |
| |
 |
|
Hallo,
Es geht aber auch noch schneller:
Das benötigt für die Testdaten der Größe 1e5 nur noch 0.013 sec, ist also 10 mal schneller als mein erster Versuch mit eine Schleife. Wieso?
Matlab's JIT-Accelerator profitiert davon, dass keine externe Funktion (max!) mehr aufgerufen wird. Zudem werden in jeder Iteration nur noch 4 DOUBLEs benötigt, nämlich iA, A(iA), B und 0. Diese passen aber in die Prozessor-Register, während "A(iB:iA-1) = max(A(iB:iA-1))" mehr Speicher benötigt. Das sind zwar nur einige Dutzend Bytes, aber der Cache des Prozessors wird dabei stärker belastet.
Zeitmessungen mit Core2Duo 2.3GHz, Win7, Matlab 2009a/64.
Der Code ist sehr elementar. C-ähnlich Konstrukte müssen in Matlab also nicht unbedingt langsam sein. Die Berücksichtigung der Funktionsweise des Prozessors hilft auf jeden Fall Laufzeit zu sparen: Ein größer/kleiner-Vergleich ist sehr billig, ebenso die Standard-Arithmetik +-*/. Der Zugriff auf den Speicher ist dagegen krötig langsam, vorallem wenn es den 2nd oder auch 3rd Level-Cache übersteigt.
Gruß, Jan
|
|
|
|
| Seban |

Forum-Meister
|
 |
Beiträge: 600
|
 |
|
 |
Anmeldedatum: 18.01.12
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ab R2014b
|
 |
|
|
 |
|
Verfasst am: 25.01.2012, 18:41
Titel:
|
 |
| Jan S hat Folgendes geschrieben: |
| Ich habe in diesem Forum ein paar Lösungen mit CUMSUM gepostet, die Suchfunktion sollte sie finden können. |
Ah ok. Danke! Werd ich mal nach stöbern.
|
|
|
|
|
|
|
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
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| 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.
|
|