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

Finden von allen Pfaden aus Wertepaaren in Vektor

 

Danybel

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.12.2012, 17:06     Titel: Finden von allen Pfaden aus Wertepaaren in Vektor
  Antworten mit Zitat      
Hallo liebes Matlab-Forum,
erstmal vielen Dank für die Hilfe, die dieses Forum schon oft geboten hat. Für mein aktuelles Problem habe ich leider noch keine Lösung gefunden.
Ich schreibe aktuell für meine Abschlussarbeit ein Programm das Objekte in einem Video erkennt und über mehrere Bilder "verfolgt". Dafür habe ich an dieser Stelle einen Vektor, der folgendermaßen besetzt ist:

Spalte 1: Bild(t)
Spalte 2: Objekt
Spalte 3: Bild(t+1)
Spalte 4: Objekt

Im folgenden Beispiel steht also ...
Objekt 1 in Bild 5 ist mit Objekt 1 in Bild 6 verbunden
Objekt 1 in Bild 6 ist mit Objekt 1 in Bild 7 verbunden
Objekt 2 in Bild 6 ist mit Objekt 2 in Bild 7 verbunden
...

Code:

testerg3 = [
     5     1     6     1
     6     1     7     1
     6     2     7     2
     7     2     8     2
     8     1     9     1
     9     1    10     1
    10     1    11     1
    11     1    12     1
    12     1    13     1
    13     1    14     1
    14     1    15     1
    15     1    16     1
    16     1    17     1
    17     1    18     1];
 


Was ich nun gerne hätte, wäre, dass alle möglichen "Pfade" (also alle Wertepaare, die miteinander verbunden sind) ausgegeben werden, für das obige Beispiel wäre das dann:

Code:

erg_pfade = [
5     1
6     1
7     1
6     2
7     2
8     2
8     1
9     1
10    1
11    1
12    1
13    1
14    1
15    1
16    1
17    1
18    1];
 


Vielleicht könnte man die einzelnen Pfade dann auch in einem Array speichern, sodass in jeder Zelle ein Pfad abgelegt wäre.

Ich hoffe, ich habe mich verständlich ausgedrückt und danke schonmal für die Hilfe Smile


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 19.12.2012, 18:11     Titel: Re: Finden von allen Pfaden aus Wertepaaren in Vektor
  Antworten mit Zitat      
Hallo Danybel,

Ich verstehe die Frage noch nicht. Wie kommt man von "testerg3" auf "erg_pfade"? Mir wird auch nicht klar, wieso testerg3 4 Spalten besitzt.
Ich rate mal, das man zunächst per RESHAPE und PERMUTE eine [Nx2]-Matrix erstellen kann und danach per "unique(X, 'rows')" die eindeutigen Zeilen findet und sortiert. Aber das ist nur eine vage Idee.

Die einzelnen Pfade sind doch bereits in einen Array, nämlich einer double-Matrix, gespeichert, allerdings nicht in eine "Zelle" sondern "Zeile". Ist das nicht ausreichend?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Danybel

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.12.2012, 19:00     Titel:
  Antworten mit Zitat      
Hallo Jan,
vielen Dank für Deine Antwort. Letztendlich habe ich testerg3 schon berechnet und würde gerne erg_pfade erhalten.
Dann erläutere ich vielleicht erstmal kurz, was ich gemacht habe. Ich habe ein Video aufgenommen, in dem Objekte gezählt und durch die verschiedenen Bilder verfolgt werden. Die detektierten Objekte wurden dann in aufeinanderfolgenden Bildern (über die Schnittfläche der Objekte) zugeordnet. Dabei gibt es beliebig viele Objekte in jedem Bild, das heißt es gibt entsprechend viele mögliche Kombinationen. In testerg3 sind nun die Kombinationen gespeichert, die weiter betrachtet werden sollen.

Code:


Bedeutet also in diesem Fall, dass: Bild 5, Objekt 1 = Bild 6, Objekt 1 ist. Entsprechend die anderen Zeilen in der Matrix. So kann man dann schauen, welche Objekte über mehrere miteinander verbunden sind. Hier müsste man also schauen, ob " 6 1" irgendwo in den ersten beiden Spalten steht. Dann würde man die Zeile " 6 1 7 1" finden, also wäre das nächste Wertepaar die "7 1", da sucht man wieder weiter und in diesem Fall wäre die Suche vorbei für die erste Zeile und setzt die Schleife auch für alle anderen Zeilen durch.

Ich hoffe, das war ein bisschen verständlicher.

Vielen Dank
 
Danybel

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.12.2012, 20:29     Titel:
  Antworten mit Zitat      
Also kurz gefragt, wie komme ich von testerg3 zu erg_pfade?
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 20.12.2012, 09:53     Titel:
  Antworten mit Zitat      
Hallo Danybel,

Du suchst nach dem Vorkommen von Zeilen aus "testerg(:, 3:4)" in "testerg(:, 1:2)". Dabei kann "ismember(a,b,'rows')" hilfreich sein, vorallem wohl der 2. Output.

Wenn die Anzahl der Objekte begrenzt ist, z.B. auf 2^16 Stück, könntest Du per: "x = testerg(:, 1) * 2^16 + testerg(:, 2)" aus den Pärchen einzelne Zahlen produzieren, womit ISMEMBER schneller rechnen kann.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Danybel

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.12.2012, 18:11     Titel:
  Antworten mit Zitat      
Hallo,
ich habe mittlerweile einen Code geschrieben, der schon irgendwie das macht, was ich gerne hätte.

Code:

for zu=1:length(testerg3)
    erg_pfade= [erg_pfade; frame1_welle(zu,:); frame2_welle(zu,:)]
    if zu > 1
        if frame1_welle(zu,:) == erg_pfade(zu-1,:)
            erg_pfade = [erg_pfade; frame2_welle(zu,:)];
        end
    end
end
 


Als Ergebnis erhalte ich dann für folgendes testerg3:
Code:

testerg3 =
     8     1     9     1
     8     2     9     2
     9     1    10     1
     9     2    10     2
    10     1    11     1
    11     1    12     1
    12     1    13     1
    13     1    14     1
    14     1    15     1
    15     1    16     1
    16     1    17     1
    17     1    18     1
 


Code:

erg_pfade =
     8     1
     9     1
     8     2
     9     2
     9     1
    10     1
    10     1
     9     2
    10     2
    10     1
    11     1
    11     1
    12     1
    12     1
    13     1
    13     1
    14     1
    14     1
    15     1
    15     1
    16     1
    16     1
    17     1
    17     1
    18     1
 


Dort sind ja ungefähr die möglichen "Pfade" untereinander (von Zeilen, die doppelt nacheinander auftreten, könnte ja eine gelöscht werden). Allerdings (wie in testerg3) ersichtlich, geht die Reihe [8 1] [9 1] mit [10 1] [11 1] weiter. Also würde ich die auch alle direkt untereinander haben, wenn diese Kette dann mit [18 1] zuende ist. Kann mit [8 2] [9 2] [10 2] fortgesetzt werden.

Tut mir leid, dass ich das nicht besser beschreiben kann. Für mich scheint das alles ganz logisch Wink
 
Danybel

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.12.2012, 18:15     Titel:
  Antworten mit Zitat      
Nachtrag (noch vor dem Code):

Code:

frame1_welle = testerg3(:,1:2);
frame2_welle = testerg3(:,3:4);

erg_pfade = [];
 
 
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.