|
|
Doppelte Bedingung zur Vektorindizierung |
|
disaster |

Forum-Newbie
|
 |
Beiträge: 8
|
 |
|
 |
Anmeldedatum: 26.08.11
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 26.08.2011, 00:30
Titel: Doppelte Bedingung zur Vektorindizierung
|
 |
Hallo,
ich habe folgendes Problem:
Ich habe insgesamt 3 Vektoren x,y und z, alle derselben Größe (bspw. 20x1). Nun möchte ich auf die Werte eines dieser Vektoren (hier einfach mal x) zugreifen, und zwar sollen dabei folgende Eigenschaften erfüllt sein:
- An dieser Position sollen die Werte von y und z gleich sein (also y == z)
- Ich möchte nur Werte eines bestimmten Intervalls (bspw. 5:12)
Also im Prinzip sowas wie
x(y == z & 5:12)
Wie kann ich das nun realisieren? Der Indexvektor y == z hat ja zwar wieder die Größe 20, wenn ich nun aber x(y==z) nehme, dann hat dieser resultierende Vektor eben nur die Größe, wie die Einträge von y und z gleich sind. Damit wäre dann meine numerische Indizierung 5:12 nichtmehr möglich.
Ein etwas umständlicher Weg wäre wohl sowas wie:
Aber geht das auch einfacher?
|
|
|
|
|
DSP |

Forum-Meister
|
 |
Beiträge: 2.117
|
 |
|
 |
Anmeldedatum: 28.02.11
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: R2014b
|
 |
|
|
 |
|
Verfasst am: 26.08.2011, 00:57
Titel:
|
 |
Bin mir noch nicht ganz sicher, ob ich dich richtig verstanden habe. Wie wäre es damit?
Im Intervall 5:12 werden alle x Werte genommen, bei denen y und z an der gleichen Stelle(Index) identisch sind. Find() findet die Indices mit der Bedingung y==z. Ist nun y(5) == z(5) liefert find() eine 1. Um nun in X auf die selbe Stelle zugreifen zu können, braucht man den Offset von 4.
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 26.08.2011, 09:52
Titel: Re: Doppelte Bedingung zur Vektorindizierung
|
 |
Dear disaster,
Genau das Problem habe ich immer und immer wieder. Das Logical-Indexing ist sehr effizient, aber das Schachteln mehrerer Indizierungen ist kompliziert. Ich werde mal eine effiziente C-Mex-Funktion dafür schreiben und in die FEX setzen, aber nicht mehr heute :-)
Ich kann nun nicht wirklich behaupten, dass dies einfacher ist als Dein Ansatz. Zudem ist es Zeit- und Speicherverschwendung, dass in x==y alle Werte verglichen werden, obwohl nur die Elemente 5:12 benötigt werden.
Gruß, Jan
|
|
|
DSP |

Forum-Meister
|
 |
Beiträge: 2.117
|
 |
|
 |
Anmeldedatum: 28.02.11
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: R2014b
|
 |
|
|
 |
|
Verfasst am: 26.08.2011, 15:22
Titel:
|
 |
Das verstehe ich jetzt aber nicht ganz...
bringt doch das gleiche Ergebnis und es wird auch nur der angesprochenen Bereich durchsucht.
|
|
|
disaster |
Themenstarter

Forum-Newbie
|
 |
Beiträge: 8
|
 |
|
 |
Anmeldedatum: 26.08.11
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 26.08.2011, 16:40
Titel:
|
 |
Danke euch beiden. Und DSP, deine Antwort war genau das, was ich gesucht habe, nämlich ohne irgendwelche blöden temporären Variablen/Vektoren nutzen zu müssen
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 26.08.2011, 17:32
Titel:
|
 |
|
 |
|
Hallo DSP,
Was verstehst Du nicht ganz? Dein Code ist völlig in Ordnung. ich hatte einfach nur eine Alternative gepostet, die bei großen Arrays (> 10.000 Elemente) deutlich effizienter ist.
Leider erzeugt dies ebenfalls temporäre Variablen:
1. t1 = y(5:12)
Immerhin ist MATLAB so schlau nicht auch "5:12" explizit zu erstellen.
2. t2 = y(5:12)
3. t3 = (t1==t2) als logical vector.
4. t4 = find(t3)
5. t5 = 4 + t4;
Diese Zwischenwerte müssen auch alloziert und kopiert werden, wenn man sie nicht explizit erstellt. Der Code ist damit viel hübscher und leichter zu warten, aber im Allgemeinen nicht schneller.
Zudem muss im letzten Schritt:
6. x(t5)
für jeden einzelnen Wert in t5 geprüft werden, ob er außerhalb der Länge von x liegt. Bei logical indexing fällt genau das weg, weshalb das so viel schneller ist. Das Problem ist dabei nicht der kurze Test, sondern dass ein Fehler per IF-Abfrage abgefangen werden muss. Und da der Prozessor nicht im Vorhinein wissen kann, in welche Richtung die IF-Abfrage verzweigt, muss die ganze Prozessor-pipeline warten, bis die Bedingung ausgerechnet worden ist.
Bei 5:12 fallen die temporären Arrays nicht ins Gewicht, bei 5:12000 aber schon und jeder gesparte Zwischenschritt ist ein deutlicher Vorteil. Bei 5:1.2e9 ist ein "hübscher" Programmierstil oft völlig sinnlos.
Gruß, Jan
|
|
|
DSP |

Forum-Meister
|
 |
Beiträge: 2.117
|
 |
|
 |
Anmeldedatum: 28.02.11
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: R2014b
|
 |
|
|
 |
|
Verfasst am: 26.08.2011, 17:45
Titel:
|
 |
Hallo Jan,
ich war einfach etwas verwirrt auf Grund deines "langen" Codes, wo du doch sonst oft alles in einem Einzeiler präsentierst . Ich dachte zunächst, dass ich etwas missverstanden habe, oder mein Code falsch ist. Nach dem ich es dann verglichen habe, trat halt die Verwunderung ein. Danke für die Erklärung...
Gruß DSP
|
|
|
|
|
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.
|
|