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

Doppelte Bedingung zur Vektorindizierung

 

disaster
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 26.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.08.2011, 00:30     Titel: Doppelte Bedingung zur Vektorindizierung
  Antworten mit Zitat      
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:
Code:

tmp1 = y(5:12);
tmp2 = z(5:12);
tmp3 = x(5:12);
output = tmp3(tmp2 == tmp1);

Aber geht das auch einfacher?
Private Nachricht senden Benutzer-Profile anzeigen


DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 26.08.2011, 00:57     Titel:
  Antworten mit Zitat      
Bin mir noch nicht ganz sicher, ob ich dich richtig verstanden habe. Wie wäre es damit?

Code:
x(4+find(y(5:12)==z(5:12)))


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.
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: 26.08.2011, 09:52     Titel: Re: Doppelte Bedingung zur Vektorindizierung
  Antworten mit Zitat      
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 :-)

Code:
x = floor(rand(1, 20) * 5);
y = floor(rand(1, 20) * 5);
index1 = (x==y);
index2(5:12) = index1(5:12);
reply = x(index2);

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
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 26.08.2011, 15:22     Titel:
  Antworten mit Zitat      
Das verstehe ich jetzt aber nicht ganz...

Code:
x(4+find(y(5:12)==x(5:12)))


bringt doch das gleiche Ergebnis und es wird auch nur der angesprochenen Bereich durchsucht.
Private Nachricht senden Benutzer-Profile anzeigen
 
disaster
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 26.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.08.2011, 16:40     Titel:
  Antworten mit Zitat      
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 Smile
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: 26.08.2011, 17:32     Titel:
  Antworten mit Zitat      
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:
Code:
x(4+find(y(5:12)==x(5:12)))

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
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 26.08.2011, 17:45     Titel:
  Antworten mit Zitat      
Hallo Jan,

ich war einfach etwas verwirrt auf Grund deines "langen" Codes, wo du doch sonst oft alles in einem Einzeiler präsentierst Wink. 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
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.